C ++ - 使用默认模板作为专业化的基础

时间:2012-10-16 21:45:56

标签: c++ templates specialization

我想写一个数学矢量模板。我有一个接受类型和大小作为模板参数的类,有很多数学运算方法。 现在我想写一些专业化,其中Vector< 3>例如,x,y,z作为成员分别引用数据[0..3]。

问题在于我不知道如何创建一个从默认模板继承所有内容的专门化,而无需创建基类或编写所有内容两次。

最有效的方法是什么?

template<class Type, size_t Size>
class Vector {
    // stuff
};

template<class T>
class Vector<3,T>: public Vector {
    public:
        T &x, &y, &z;
        Vector(): Vector<>(), x(data[0]), y(data[1]), z(data[2]){}
        // and so on
};

2 个答案:

答案 0 :(得分:7)

不知怎的,你应该能够从默认实现派生出来,但是你正在专门化一个实例,那么如何?它应该是一个非专业版本,您可以从中派生出来。这很简单:

// Add one extra argument to keep non-specialized version!
template<class Type, size_t Size, bool Temp = true>
class Vector {
    // stuff
};
// And now our specialized version derive from non-specialized version!
template<class T>
class Vector<T, 3, true>: public Vector<T, 3, false> {
    public:
        T &x, &y, &z;
        Vector(): Vector<>(), x(data[0]), y(data[1]), z(data[2]){}
        // and so on
};

答案 1 :(得分:1)

考虑以稍微不同的方式进行此操作,但目标将实现,添加外部接口 - 我的意思是独立函数X(),Y(),Z():

template<class T, size_t S>
T& x(Vector<T, S>& obj, typename std::enable_if<(S>=1)>::type* = nullptr)
{
   return obj.data[0];
}

template<class T, size_t S>
T& y(Vector<T, S>& obj, typename std::enable_if<(S>=2)>::type* = nullptr)
{
   return obj.data[1];
}

template<class T, size_t S>
T& z(Vector<T, S>& obj, typename std::enable_if<(S>=3)>::type* = nullptr)
{
   return obj.data[2];
}

之间没有太大区别:

 Vector<T, 3>& obj
 return obj.x();

 Vector<T, 3>& obj
 return x(obj);

作为奖励 - 此界面适用于匹配尺寸。