C++ 如何防止特定模板的隐式模板实例化?
我想阻止特定模板化类的所有隐式模板实例化,以防止它被实例化到每个翻译单元中 看起来我的选择是:C++ 如何防止特定模板的隐式模板实例化?,c++,templates,c++11,C++,Templates,C++11,我想阻止特定模板化类的所有隐式模板实例化,以防止它被实例化到每个翻译单元中 看起来我的选择是: 在gcc的命令行上使用-fno隐式模板。这 抑制所有隐式模板实例化,这不是我想要的。我只想为单个模板阻止它 使用C++11“外部模板”。但这只会抑制特定的 显式实例化。我不想打一个“外人” 此列表中每个潜在模板参数的“模板”行 模板可能会被实例化 所以我需要介于两者之间的东西。最好有: extern template class Foo; // suppress all implicit insta
extern template class Foo; // suppress all implicit instantiations of Foo
(注意缺少模板参数)有什么想法吗?< /P> < P>我会说,你的问题的答案是使用C++新的特性来断言构造函数中的实例化:
static_assert(std::is_same<TInstantiation, [your-predefined-type]> || std::is_same<TInstantiation, [your-predefined-type2]> /*And so on...*/, "Classname can not be instantiated using this type!");
static_assert(std::is_same | | std::is_same/*等等…*/,“无法使用此类型实例化类名!”);
所有这些都保证在编译时解析:)您可以像使用非模板类一样拆分该类。只需将声明放在一个头中,并将其包含在所有位置,然后将实现放在一个.inl/.i文件中,并仅在希望实例化模板的位置包含该声明。或者,可以使用编译时开关对单个文件执行此操作,但您必须将声明和实现分开。您可以使用
std::enable\u if
,它通过组合std::is\u same
:
template <class T , typename = std::enable_if <!std::is_same<T,Foo>::value,T>::type >
class MyClass{
//...
};
模板::类型>
类MyClass{
//...
};
现在,myClass不会为
Foo
type编译。用例是什么?您是在试图阻止某些实例化被使用,还是只是想节省一些对象文件空间和链接时间?我是在试图节省编译时间。在这种情况下会有很大的不同。虽然我可以偶尔梳理一下反汇编,找到任何需要显式外部化的新实例,我更希望链接器在任何新的隐式实例化上出错,以便进行因果修改的人员可以立即将它们添加到显式实例化列表中。您可以像非模板一样在头文件和源文件之间拆分模板定义。然后,除非为源文件中允许的类型集显式实例化模板,否则链接将失败。谢谢此外,如果需要在多个源文件之间传播显式实例化,我可以将模板实现细节放入一个.tcc文件中,该文件包含在这些源文件中,类似于gcc头的结构。