Страницы

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

четверг, 14 февраля 2019 г.

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

Есть шаблонный класс вектора:
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. Как этого можно добиться, не прописывая шаблон для каждого случая?


Ответ

Вы можете использовать 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

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

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