c++ - 递归显式模板实例化是否可能?

标签 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 ?如果不可能,您是否知道使用预处理器执行此操作的方法?

事实上,我有兴趣将其推广到具有多个模板参数的类,例如 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/

相关文章:

c++ - 在 C/C++ 中在本地时间和 GMT/UTC 之间转换

python - argv 的 ctypes 错误

c++ - 使用模板元编程 [C++11] 对整数列表进行操作

c++ - 使用自身作为参数的模板类。 C++

c++ - Boost 的 UDP 异步客户端接收自己的数据报

c++ - qmake 相当于 cmake execute_process()

c++ - 如何在模板中存储右值或左值引用

c++ - 什么时候实例化 constexpr 函数模板?

c++ - 有什么方法可以使模板函数应用于 C++ 中任意长度的数组?

c++ - 模板整数参数构造函数