4

假设我有一个 2D 矢量模板类:

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

我希望 aVec2<double>和 a之间总和的结果Vec2<int>是 a Vec2<double>,但默认情况下 C++ 不会这样做。

我想错了吗?
我应该尝试实现这种行为吗?

我应该如何实现它?一种方法可能是重载任何运算符,以便使用autodecltype/或某些人自己进行类型提升来计算提升的类型,但这种方式绝不是微不足道的,甚至不允许我使用 boost.operators 来简化我的工作。其他建议?

4

2 回答 2

3

我喜欢这样:

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

于 2011-02-28T08:14:01.443 回答
0

Vec2<double>并且Vec2<int>是完全独立的类型,恰好是从同一个模板创建的。如果您希望任何涉及这两者的操作成为可能,您需要自己实现它。

您可以创建基于基本类型进行提升的通用运算符,或者您可以针对您需要的情况进行显式提升,这对 IMO 更安全

于 2011-02-28T08:16:47.700 回答