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

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

看起来我的选择是:

  • 在gcc的命令行上使用-fno-implicit-templates。 这会抑制所有隐式模板实例化,而不是我想要的。 我只想阻止它为单个模板。
  • 使用C ++ 11“extern模板”。 但是这只能抑制特定的显式实例化。 我不想为这个模板可能实例化的每个潜在模板参数列表输入一个“extern模板”行。
  • 所以我需要中间的东西。 这将是很高兴有:

     extern template class Foo; // suppress all implicit instantiations of Foo
    

    (注意缺少模板参数。)任何想法?


    您可以像使用非模板类一样拆分类。 只需将声明放入一个头文件中并将其包含到任意位置,然后将该实现文件放入一个.inl / .i文件中,并将其仅包含在您希望模板实例化的位置。 或者,使用编译时间开关来对单个文件执行此操作 - 但您必须将声明和实现分开。


    你可以使用std::enable_if ,它与std::is_same的组合std::is_same

    template <class T , typename = std::enable_if <!std::is_same<T,Foo>::value,T>::type >
    class MyClass{
    //...
    };
    

    现在myClass不会被编译为Foo类型。


    我会说你的问题的答案是使用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!");
    

    这一切都保证在编译时解决:)

    链接地址: http://www.djcxy.com/p/26469.html

    上一篇: How do I prevent implicit template instantiations for a specific template?

    下一篇: JNDI naming exception on JRE7