递归模板:继承与组合

时间:2018-08-23 15:14:44

标签: c++ templates metaprogramming

我的C ++技能有点生锈,可以追溯到C ++ 99,所以我决定花一些时间练习更多进化的元编程。

我正在尝试使用递归模板来实现Vector类。 我发现两种方法:

  1. 使用继承:在这种情况下,维数N的向量将从维数N-1的向量继承。请参阅下面的#1示例代码。
  2. 使用合成:在这种情况下,维度N的向量由一个值和维度N-1的向量组成。请参阅下面的#2示例代码。

就C ++中的元编程而言,以一种或另一种方式进行操作是否有任何优势?如果我沿着一条道路或另一条道路走,会有一些陷阱吗?还是在这两种情况下,编译器都能完成几乎相同的工作?

//
// Sample code 1 -- Using inheritance
//
template<unsigned int DIM>
class VectorND : VectorND<DIM-1> {
    private:
    double _n;

    public:
    template<class N, class... Rest>
    VectorND(N n, Rest... rest): _n(n), VectorND<DIM-1>(rest...) {};
};

template<>
class VectorND<0> {

};

int main() {
    VectorND<3> v(1,2,3);

}

//
// Sample code 2 -- Using composition
//
template<unsigned int DIM>
class VectorND {
    private:
    VectorND<DIM-1> _base;
    double _n;

    public:
    template<class N, class... Rest>
    VectorND(N n, Rest... rest): _n(n), _base(rest...) {};
};

template<>
class VectorND<0> {

};

int main() {
    VectorND<3> v(1,2,3);

}

0 个答案:

没有答案