C++: продвижение неродных типов


Предположим, что у меня есть 2D векторный шаблон класса:

template<typename T> class Vec2 {
    T x, y;
    // ...
};

Я ожидал бы, что результатом суммы между A Vec2<double> и A Vec2<int> будет a Vec2<double>, но C++ не будет делать этого по умолчанию.

Я думаю неправильно?
Должен ли я попытаться реализовать это поведение?

И как я должен был бы это реализовать? Одним из способов может быть перегрузка любого оператора, так что повышенный тип вычисляется с помощью auto и decltype или некоторых сделай это сам тип продвижение , но этот способ не является чем-то тривиальным и даже не позволит мне использовать boost.операторы, чтобы облегчить мне работу. Другие предложения?

2 4

2 ответа:

Мне это нравится:

template<class V, class W>
struct vector_add;  

template<typename T, typename U, size_t N>
struct vector_add<Vec<T,N>, Vec<U,N> > {
    typedef BOOST_TYPEOF_TPL(T()+U()) value_type;
    typedef Vec<value_type, N> type;
};

Http://www.boost.org/doc/libs/1_43_0/doc/html/typeof/refe.html#typeof.typo

Также:

Http://www.boost.org/doc/libs/1_46_0/libs/utility/operators.htm

Vec2<double> и Vec2<int> являются полностью независимыми типами, которые были созданы из одного шаблона. Если вы хотите, чтобы любая операция, включающая в себя оба этих фактора, была возможной, вы должны реализовать ее самостоятельно.

Вы можете создать универсальные операторы, которые продвигают на основе базового типа, или вы можете сделать явные рекламные предложения для случаев, которые вам нужны, что ИМО безопаснее