给出一个类似的模板
template<int dim> class Point { ... };
Run Code Online (Sandbox Code Playgroud)
这个模板可以明确地实例化
template class Point<0>;
template class Point<1>;
template class Point<2>;
template class Point<3>;
Run Code Online (Sandbox Code Playgroud)
而不是像上面那样单独实例化每个模板,我想用一个调用来递归地实例化它们
template class RecursiveInstantiate<Point, 3>;
Run Code Online (Sandbox Code Playgroud)
其中,RecursiveInstantiate<T, i>
将实例T<i>
,T<i-1>
..., T<0>
.是否有可能创建这样一个类RecursiveInstantiate
?如果不可能,您是否知道使用预处理器的方法?
其实我感兴趣的概括这对于喜欢多个模板参数类Node<int i1,int i2,int i3>
为I1,I2,I3的所有组合{0,1,2,3}.但我希望能够自己解决这第二部分.
任何建议,也解释为什么我想要达到的目标是不可能的.
更新:感谢您对目前的评论.我现在更清楚地看到问题的确切位置.这条线
template class Point<3>;
Run Code Online (Sandbox Code Playgroud)
实例化模板并将其符号导出到目标文件.表单的实例化
template class RecursiveInstantiate<Point, 3>;
Run Code Online (Sandbox Code Playgroud)
可以实例化类class Point<3>
,class Point<2>
....显然这只发生在本地.模板不会导出到目标文件.也许我将不得不使用预处理器寻找解决方案.
正如我现在所看到的那样,我在开始时并未完全提出我的问题,我感谢您的答案和选择的答案是正确的.
注意:我在linux上使用g ++/clang作为编译器进行尝试.
你可以创建一个Instantiator类:
template <unsigned int N> struct Instantiator
{
Point<N> p;
Instantiator<N-1> i;
};
template <> struct Instantiator<0>
{
Point<0> p;
};
Run Code Online (Sandbox Code Playgroud)
然后只需添加一个显式实例化: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>;
Run Code Online (Sandbox Code Playgroud)