首页 > 解决方案 > 递归模板:继承与组合

问题描述

我的 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);

}

标签: c++templatesmetaprogramming

解决方案


推荐阅读