C ++: продвижение не родных типов - PullRequest
4 голосов
/ 28 февраля 2011

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 28 февраля 2011

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

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

0 голосов
/ 28 февраля 2011

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

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

...