防止模板类的所有实例化 - 包括支持的类型

时间:2014-10-26 13:02:45

标签: c++ templates extern explicit-instantiation

如果我有模板类MyClass<T>,并且我明确实例化intfloat(在cpp文件中),那么我可以使用extern template class MyClass<int>extern template class MyClass<float>以防止遇到此类的任何编译单元不必要地为intfloat实例化它。当然,对于任何其他类型,该类仍将被实例化。

现在我有一个课程MyClass2<T>,仅适用于intfloatchardoubleshort及其无符号变体适用的地方。由于我事先知道所有类型,因此该类中所有方法的定义都在cpp文件中。这也是我为所有上述类型显式实例化MyClass2<T>的地方。在标题中,我static_assert阻止用户使用不受支持的类型创建MyClass2<T>

有没有办法完全阻止MyClass2<T>实例化(例如extern template class MyClass2;虽然我知道它不起作用)所有类型的包括受支持的类型?就像extern template全部一样?我想避免为所有支持的类型键入extern template class MyClass2<int>

考虑到我已经明确地为这些类型实例化了类,它似乎不仅是多余的,而且对于大项目(比如我正在处理的那个)而且每次添加新类型时我需要维护另外几行。

3 个答案:

答案 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>
{};