我怎样才能检查一个types是一个给定的类模板的实例?

是否有可能检查一个types是一个特定模板的实例?

我有一个类模板,其中一个模板参数必须是特定模板的实例或其他types。 例如,考虑一个types列表的简单定义:

struct null_type; template <typename Head, typename Tail> struct typelist { // Tail must be a typelist or null_type typedef Head head; typedef Tail tail; }; 

现在,我想确保为Tail模板参数提供的types始终是typelistnull_type的实例。 我可以使用部分特化来为这些情况定义模板,如下所示:

 template <typename Head, typename Tail> struct typelist; // default, not defined template <typename Head, typename H, typename T> struct typelist< Head, typelist<H,T> > // Tail = typelist, ok { typedef Head head; typedef typelist<H,T> tail; }; template <typename Head> struct typelist< Head, null_type > // Tail = null_type, ok { typedef Head head; typedef null_type tail; }; 

但是,我最终重复了代码,这是我想避免的。 理想情况下,我需要一个特征来testing一个types是否是一个模板的实例化,以便在enable_if中使用它或者在静态断言中使用它:

 #include <boost/mpl/or.hpp> #include <type_traits> struct null_type; template <typename Head, typename Tail> struct typelist { static_assert( boost::mpl::or_< is_instantiation_of< typelist, Tail >, std::is_same< Tail, null_type > >::value, "Tail must be a typelist or null_type" ); typedef Head head; typedef Tail tail; }; 

在标准库或Boost中已经有这样一个特征( is_instantiation_of )吗? 是可以写一个吗?

我想出了以下解决scheme,使用C ++ 11 variadic模板和简单的部分特化:

 #include <type_traits> template < template <typename...> class Template, typename T > struct is_instantiation_of : std::false_type {}; template < template <typename...> class Template, typename... Args > struct is_instantiation_of< Template, Template<Args...> > : std::true_type {}; 

它可以通过使用预处理器为不同数量的模板参数生成版本来适应C ++ 03,但也许有一种更简单的方法。