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

时间:2011-09-12 23:15:21

标签: c++ templates

给出像

这样的模板
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作为编译器。

2 个答案:

答案 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

访问该特定值的值。