给定一个模板
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
?如果不可能,您是否知道使用预处理器执行此操作的方法?
事实上,我有兴趣将其推广到具有多个模板参数的类,例如 Node<int i1,int i2,int i3>
对于 {0,1,2,3} 中 i1,i2,i3 的所有组合。但我希望能够自己解决这个第二部分。
任何建议,以及为什么不可能实现我想要实现的目标的解释,我们都将不胜感激。
更新:感谢您到目前为止的评论。我现在更清楚地看到了真正的问题所在。线路
template class Point<3>;
实例化模板并将其符号导出到目标文件。表单的实例化
template class RecursiveInstantiate<Point, 3>;
可以实例化类 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;
};
然后简单地添加一个显式实例化: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>;
关于c++ - 递归显式模板实例化是否可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7395113/