如果我有模板类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>
。
考虑到我已经明确地为这些类型实例化了类,它似乎不仅是多余的,而且对于大项目(比如我正在处理的那个)而且每次添加新类型时我需要维护另外几行。
答案 0 :(得分:1)
你可以使用类似下面的SFINAE
template<typename T>
using value_type = typename std::enable_if<
std::is_same<float, T>::value ||
std::is_same<double, T>::value
//...other supported types goes here
>::type ;
template<class T, class Enable = void>
class MyClass2 ;
template<class T>
class MyClass2<T, value_type<T> >
{
};
MyClass2<float> t;
MyClass2<int> t1; // Error !
请参阅Here
答案 1 :(得分:1)
老实说这听起来像是一个宏观的工作:
// explicit_instantiations.h
#ifndef PERFORM_INSTANTIANTION
#define EXTERNALLY_INSTANTIATED extern
#else
#define EXTERNALLY_INSTANTIATED
#endif
EXTERNALLY_INSTANTIATED template class MyClass<int>;
EXTERNALLY_INSTANTIATED template class MyClass<float>;
// etc.
// header
#include "explicit_instantiations.h"
// cpp file
#define PERFORM_INSTANTIATION
#include "explicit_instantiations.h"
答案 2 :(得分:0)
怎么样:
template <typename T>
struct Base {};
template <typename T>
struct Supported;
template <>
struct Supported<int> : public Base<int>
{};