实例化多个模板

Sam*_*rsa 3 c++ templates

如果我有一个名为的类Tuple<T, SIZE>,并且我想要在编译库时实例化 20 个不同的浮动模板(以便用户不会遇到链接错误):

template Tuple<float, 1>;
template Tuple<float, 2>;
...
template Tuple<float, 20>;
Run Code Online (Sandbox Code Playgroud)

有什么办法可以递归地执行上述操作吗?也许允许它灵活,以便我可以将其放入我想要的任何数字,并为我实例化类?

编辑:到目前为止我尝试过的(似乎不起作用):

template <typename T, unsigned int MAX_RANGE>
class AllTuples
{
  Tuple<T, MAX_RANGE> y;
  AllTuples<T, MAX_RANGE - 1> x;
};

template <typename T>
class AllTuples<T, 1>
{
  Tuple<T, 1> x;
};
AllTuples<float, 10>;
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 5

很抱歉你运气不好。除非您使用预处理器元编程库 (boost.pp),否则无法实现自动化。不适用于模板元编程。

您所生成的内容是的隐式实例Tuple<float, N>。但是隐式实例化与显式实例化有两个重要的区别

  1. 它们不会实例化所有成员定义(仅实例化那些立即需要的成员定义)。其他定义仅在使用时才被实例化。
  2. 使用的成员定义的隐式实例化不能用作其他翻译单元的定义源。

对于后者,由于我不知道其原因,我将仅引用规范。

非导出模板必须在隐式实例化的每个翻译单元中定义(14.7.1),除非在某些翻译单元中显式实例化相应的专业化(14.7.2);无需诊断。

这可能与链接器复杂性有关,因为同一模板的隐式实例化可能在多个翻译单元中多次出现,因此需要特殊处理。显式实例化和非内联函数则不能。