#cpp #шаблоны_с++
Есть шаблонный класс вектора: template< int size, typename Type > class Vector; Есть шаблонный оператор для сложения двух векторов: template< int size, typename LeftType, typename RightType > Vectoroperator+( 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, то #includetemplate< int size, typename LeftType, typename RightType > Vector () + std::declval ())> ...
Комментариев нет:
Отправить комментарий