C++ 如何防止特定模板的隐式模板实例化?

C++ 如何防止特定模板的隐式模板实例化?,c++,templates,c++11,C++,Templates,C++11,我想阻止特定模板化类的所有隐式模板实例化,以防止它被实例化到每个翻译单元中 看起来我的选择是: 在gcc的命令行上使用-fno隐式模板。这 抑制所有隐式模板实例化,这不是我想要的。我只想为单个模板阻止它 使用C++11“外部模板”。但这只会抑制特定的 显式实例化。我不想打一个“外人” 此列表中每个潜在模板参数的“模板”行 模板可能会被实例化 所以我需要介于两者之间的东西。最好有: extern template class Foo; // suppress all implicit insta

我想阻止特定模板化类的所有隐式模板实例化,以防止它被实例化到每个翻译单元中

看起来我的选择是:

  • 在gcc的命令行上使用-fno隐式模板。这 抑制所有隐式模板实例化,这不是我想要的。我只想为单个模板阻止它
  • 使用C++11“外部模板”。但这只会抑制特定的 显式实例化。我不想打一个“外人” 此列表中每个潜在模板参数的“模板”行 模板可能会被实例化
  • 所以我需要介于两者之间的东西。最好有:

     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头的结构。