递归模板:继承与组合 我的C++技能有点生疏,可以追溯到C++ 99,所以我决定花些时间练习更多的元程序设计。
我试图使用递归模板来实现一个向量类。 我找到两种方法:递归模板:继承与组合 我的C++技能有点生疏,可以追溯到C++ 99,所以我决定花些时间练习更多的元程序设计。,c++,templates,metaprogramming,C++,Templates,Metaprogramming,我试图使用递归模板来实现一个向量类。 我找到两种方法: 使用继承:在这种情况下,维度N的向量继承自维度N-1的向量。请参见下面的#1示例代码 使用合成:在这种情况下,维度N的向量由值和维度N-1的向量组成。请参见下面的#2示例代码 P>关于C++中的元编程,在做一个或另一个方面有什么好处吗?如果我走这条路或那条路,会有一些陷阱吗?或者在这两种情况下,编译器能够完成几乎相同的工作吗 // // Sample code 1 -- Using inheritance // template<u
//
// 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);
}
//
//示例代码1——使用继承
//
模板
类VectorND:VectorND{
私人:
双倍;;
公众:
模板
向量(N,Rest…Rest):\N(N),向量(Rest…{};
};
模板
类向量{
};
int main(){
向量v(1,2,3);
}
//
//示例代码2——使用组合
//
模板
类向量{
私人:
矢量基;
双倍;;
公众:
模板
向量(N,Rest…Rest):\N(N),\u基(Rest…{};
};
模板
类向量{
};
int main(){
向量v(1,2,3);
}
依赖名称通常在继承方面更令人惊讶。顺便说一句,std::array
完成了这项工作(成员类似于double data[N];
)。@Jarod42我觉得这也会更简单(可能会更快编译,因为实例化更少?),代码似乎比使用组合时更冗长。关于std::array
——确实如此,但这主要是我练习“现代”模板的借口;)@Borgleader:对于Meta prog,“复杂性”实际上是实例化的数量。
//
// 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);
}