如果我有一个名为 Tuple<T, SIZE>
的类比方说,我想要在编译库时实例化 20 个不同的 float 模板(这样用户就不会遇到链接错误):
template Tuple<float, 1>;
template Tuple<float, 2>;
...
template Tuple<float, 20>;
有什么方法可以递归执行上述操作吗?也许允许它变得灵活,以便我可以输入任何我想要的数字,它会为我实例化类?
编辑:到目前为止我尝试过的(似乎不起作用):
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>;
最佳答案
很抱歉你运气不好。除非您使用预处理器元编程库 (boost.pp),否则无法实现自动化。不适用于模板元编程。
您在那里生成的是 Tuple<float, N>
的隐式实例化 .但是隐式实例化与显式实例化有两个重要区别
- 他们不会实例化所有成员定义(只有那些立即需要的才会实例化)。其他定义仅在使用时实例化。
- 使用的成员定义的隐式实例化不能用作其他翻译单元的定义源。
对于后者,由于我不知道其中的原因,我将只引用规范。
A non-exported template must be defined in every translation unit in which it is implicitly instantiated (14.7.1), unless the corresponding specialization is explicitly instantiated (14.7.2) in some translation unit; no diagnostic is required.
这可能与链接器的复杂性有关,因为同一模板的隐式实例化可以在多个翻译单元中多次出现,因此它们需要特殊处理。显式实例化和非内联函数不能。
关于c++ - 实例化多个模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6397657/