递归显式模板实例化可能吗?

H. *_*ier 6 c++ templates

给出一个类似的模板

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作为编译器进行尝试.

Ker*_* SB 9

你可以创建一个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)