如果我有一个名为的类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)
很抱歉你运气不好。除非您使用预处理器元编程库 (boost.pp),否则无法实现自动化。不适用于模板元编程。
您所生成的内容是的隐式实例Tuple<float, N>。但是隐式实例化与显式实例化有两个重要的区别
对于后者,由于我不知道其原因,我将仅引用规范。
非导出模板必须在隐式实例化的每个翻译单元中定义(14.7.1),除非在某些翻译单元中显式实例化相应的专业化(14.7.2);无需诊断。
这可能与链接器复杂性有关,因为同一模板的隐式实例化可能在多个翻译单元中多次出现,因此需要特殊处理。显式实例化和非内联函数则不能。