c++ - 实例化多个模板

标签 c++ templates

如果我有一个名为 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>隐式实例化 .但是隐式实例化与显式实例化有两个重要区别

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

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

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/

相关文章:

c++ - 我如何使用模板类作为另一个类的类型名?

C++ 两个 is_union_or_class 实现

c++ - 如何访问模板包参数的模板参数

c++ - 浮点值加倍和除法

c++ - 二维数组

c++ - 为什么 VC++ 字符串不被引用计数?

c++ - 相似但不相同的代码模板?

c++ - 提升在多个线程上运行的 asio strand 和 io_service

c++ - C++ 上 char 数组输出中不同颜色的字符

.so 文件中的 C++ 模板化函数