模板 - 在必要时使用int,short或float的类

时间:2011-07-17 07:55:09

标签: c++

我想编写一个管理欧几里德矢量的类,并使用short,int,long或float存储其初始点。我想创建一个这样的模板:

    template<class unit> class EVector
{
private:
    unit x;
    unit y;
public:
    EVector();
    setX();
    setY();
};

因此,用户创建一个EVector,选择合适的基元类型。但是我如何在不同的类之间实现操作,例如

EVector<int> a;
EVector<float> b;

EVector<double> c;

c = a + b;  

operator =将复制坐标,operator +添加它们。

2 个答案:

答案 0 :(得分:3)

另外,您可以使用我的promote实施:

template<typename A, typename B> 
EVector<typename promote<A, B>::type>
operator +(EVector<A> const& a, EVector<B> const& b) {
  EVector<typename promote<A, B>::type> ev;
  ev.setX(a.getX() + b.getX());
  ev.setY(a.getY() + b.getY());
  return ev;
}

对于类型doubleint,它会产生double例如。

答案 1 :(得分:2)

EVector<U>可转换为EVector<T>

时,您希望从UT启用分配(和复制构造)
template<class T>
class EVector
{
   template<class U>
   EVector(EVector<U> const & rhs)
           :x(rhs.x), y(rhs.y)
   {
   }
   ...
}

请注意,即使您提供了这个模板化的复制构造函数,编译器也会为您生成一个复制构造函数(当TU相同时)。在这种情况下,您可以使用该默认实现 - 它完全符合您的需要。但是否则你必须明确定义非模板化的构造函数(和复制赋值)。