【发布时间】:2014-10-28 23:46:51
【问题描述】:
如果我有一个模板类 MyClass<T> 并且如果我显式实例化 int 和 float(在 cpp 文件中),那么我可以使用 extern template class MyClass<int> 和 extern template class MyClass<float> 来防止遇到任何编译单元这个类不必要地为int 和float 实例化它。当然,对于任何其他类型,该类仍然会被实例化。
现在我有一个 MyClass2<T> 类,它仅适用于 int、float、char、double、short 及其未签名的变体(如果适用)。因为我事先知道所有的类型,所以这个类中所有方法的定义都在cpp文件中。这也是我为所有上述类型显式实例化MyClass2<T> 的地方。在标题中,我有 static_assert 阻止用户使用不受支持的类型创建 MyClass2<T>。
有没有办法完全阻止 MyClass2<T> 对所有类型(包括支持的类型)进行实例化(例如 extern template class MyClass2;,尽管我知道这不起作用)?像extern template 的全部?我想避免为所有支持的类型输入extern template class MyClass2<int>。
考虑到我已经为这些类型显式地实例化了类,这似乎不仅是多余的,而且对于大型项目(比如我正在处理的项目)来说,每次添加新类型时我还需要维护另外几行代码。
【问题讨论】:
-
我们的代码是跨平台的,所以
MSVC++ 2010-2013、CLang in XCode 6和GCC。
标签: c++ templates extern explicit-instantiation