实例化多个模板
Instantiating multiple templates
本文关键字:实例化 更新时间:2023-10-16
如果我有一个名为Tuple<T, SIZE>
的类,并且我想要在编译库时实例化20个不同的浮动模板(这样用户就不会遇到链接错误):
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>
的隐式实例化。但是隐式实例化与显式实例化有两个重要区别
- 它们不会实例化所有成员定义(只实例化那些立即需要的成员定义)。其他定义只有在使用时才会实例化
- 所用成员定义的隐式实例化不能用作其他翻译单元的定义源
对于后者,由于我不知道原因,我只引用规范
非导出模板必须在每个隐式实例化的翻译单元中定义(14.7.1),除非在某个翻译单元中显式实例化了相应的专门化(14.7.2);不需要进行诊断。
这可能与链接器的复杂性有关,因为同一模板的隐式实例化可能在多个翻译单元中发生多次,因此需要特殊处理。显式实例化和非内联函数不能。
您可以使用一些模板魔术来强制实例化:
namespace {
template <unsigned N>
struct Instantiator {
void instantiate_members(const Tuple<float,N>& tuple, Instantiator<N-1>) {
// use **all** member functions here
// so that they get instantiated
}
template <>
struct Instantiator<0> {}
}
然后实例化这个模板:
template class Instantiator<20>;
不幸的是,这在维护方面并不好,因为您需要使instantiate_members函数保持最新。您需要确保所有成员都被调用,包括所有各种重载。
避免模板链接错误的正确方法是将模板定义放在每个使用它们的TU中。通常,头文件最适合用于此目的。使用这样的显式实例化往好里说是半有效的,往坏里说只是令人困惑。
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 对显式实例化的模板函数的未定义引用
- [temp.variadic]中关于包扩展实例化的措辞