加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何检查类型是否是给定类模板的实例化?

发布时间:2020-12-16 05:53:25 所属栏目:百科 来源:网络整理
导读:这个问题在这里已经有一个答案: Doing a static_assert that a template type is another template2 是否可以检查一个类型是特定模板的实例化? 我有一个类模板,其中一个模板参数必须是特定模板的实例化或其他类型.例如,考虑一个类型列表的简单定义: struc
这个问题在这里已经有一个答案:> Doing a static_assert that a template type is another template2
是否可以检查一个类型是特定模板的实例化?

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

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模板参数提供的类型始终是类型列表的实例化或null_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;
};

标准库或Boost中是否有这样的特质(is_instantiation_of)?是可以写一个吗?

解决方法

我想出了以下解决方案,使用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,但也可能有一种更简单的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读