我如何检查是否一个类型是给定类模板的实例? [重复] 我如何检查是否一个类型是给定类模板的实例?

2019-06-14 09:19发布

这个问题已经在这里有一个答案:

  • 做一个static_assert,一个模板类型的另一个模板 3个回答

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

我有一个类模板,其中所述模板参数的一个必须是一个特定的模板的实例化,或一些其它类型的。 例如,考虑一个类型串的这个简单的定义:

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模板参数始终为的一个实例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;
};

然而,我最终复制代码,这是我想避免的。 理想情况下,我需要一个性状测试类型是否是一个模板的实例,与使用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;
};

就是这样一个特质( is_instantiation_of )标准库或升压已经可用? 是可以写一个?

Answer 1:

我想出了以下解决方案,使用C ++ 11个可变参数模板和简单的局部特殊化:

#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,但有可能是一个更简单的方法。



文章来源: How can I check if a type is an instantiation of a given class template? [duplicate]