给出像
这样的模板template<int dim> class Point { ... };
此模板可以像
一样明确地实例化template class Point<0>;
template class Point<1>;
template class Point<2>;
template class Point<3>;
而不是像上面那样单独实例化每个模板,我想通过一个调用来递归地实例化它们,如
template class RecursiveInstantiate<Point, 3>;
其中RecursiveInstantiate<T, i>
将实例化T<i>
,T<i-1>
,...,T<0>
。是否有可能创建这样的类RecursiveInstantiate
?如果不可能,您知道如何使用预处理器吗?
事实上,我有兴趣为{0,1,2,3}中i1,i2,i3的所有组合使用多个模板参数(例如Node<int i1,int i2,int i3>
)来推广这个。但我希望能够自己解决这第二部分。
任何建议,也解释为什么我想达到的目标是不可能的。
更新:感谢您对目前的评论。我现在更清楚地看到问题的确切位置。这条线
template class Point<3>;
实例化模板并将其符号导出到目标文件。表单的实例化
template class RecursiveInstantiate<Point, 3>;
可以实例化类class Point<3>
,class Point<2>
,....显然这只发生在本地。模板不会导出到目标文件。也许我将不得不使用预处理器寻找解决方案。
正如我现在所看到的那样,我在开始时并没有完全提出我的问题,我感谢您的答案和选择的答案是正确的。
注意:我在linux上尝试使用g ++ / clang作为编译器。
答案 0 :(得分:8)
您可以创建一个Instantiator类:
template <unsigned int N> struct Instantiator
{
Point<N> p;
Instantiator<N-1> i;
};
template <> struct Instantiator<0>
{
Point<0> p;
};
然后只需添加一个显式实例化:template struct Instantiator<81>;
您可以按字典顺序将此想法扩展到任意数量的积分参数。
正如@Georg所说,让我们通用:
template <template <unsigned int> class T, unsigned int N> struct Instantiator
{
T<N> t;
Instantiator<T, N-1> i;
};
template <template <unsigned int> class T> struct Instantiator<T, 0>
{
T<0> t;
};
template struct Instantiator<Point, 82>;
答案 1 :(得分:4)
你可以这样做:
template<int dim> struct Point {
static const int val = dim;
Point<dim - 1> p;
};
template<> struct Point<0> { ... };
当模板参数为0
时,它会为模板参数创建一个模板特化,这样递归就会停止,当你实例化一个这样的模板参数时:
Point<4>
它从Point<4>
实例化为Point<0>
。然后就可以了
Point<4>::val
访问该特定值的值。