Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Выбор типа без потери точности c++

#cpp #шаблоны_с++


Есть шаблонный класс вектора:

template< int size, typename Type >
class Vector;


Есть шаблонный оператор для сложения двух векторов:

template< int size, typename LeftType, typename RightType >
Vector operator+( const Vector& left, const Vector& right )
    {...}


Который, по задумке, должен работать с любыми типами векторов, лишь бы они были одного
размера. Чтобы можно было сложить Vector<3, int> и Vector<3, double>. Но встает вопрос
- как определить результирующий тип вектора, чтобы точность не терялась?

Например для int и  double логично было бы выбрать double, для int и float - float,
для float и double - double. Как этого можно добиться, не прописывая шаблон для каждого
случая?
    


Ответы

Ответ 1



Вы можете использовать std::common_type. Ниже показана демонстрационная программа. Я объявил класс Vector с минимальными свойствами, чтобы лишь продемонстрировать использование std::common_type. #include #include #include template< int size, typename Type > struct Vector { std::vector v; }; template< int size, typename LeftType, typename RightType > Vector::type> operator +( const Vector& left, const Vector& right ) { Vector::type> v; v.v.resize( size ); for ( int i = 0; i < size; i++ ) v.v[i] = left.v[i] + right.v[i]; return v; } int main() { Vector<5, int> left = { { 1, 2, 3, 4, 5 } }; Vector<5, double> right = { { 0.1, 0.2, 0.3, 0.4, 0.5 } }; auto v = left + right; for ( int i = 0; i < 5; i++ ) std::cout << v.v[i] << ' '; std::cout << std::endl; } Ее вывод на консоль: 1.1 2.2 3.3 4.4 5.5

Ответ 2



Если есть возможность использовать C++11, то #include template< int size, typename LeftType, typename RightType > Vector() + std::declval())> ...

Комментариев нет:

Отправить комментарий