创建一个可以同时在类型和变量上调用的类型特征

问题描述

C ++中有两个可以在类型变量调用的运算符:sizeoftypeid

假设我们想以类似的行为something like *来实现自己的操作:

template<bool is_type>
struct type_traits_T;

template<>
struct type_traits_T<true> {
    template<typename T>
    struct type_traits {
        using mydecltype = T;
        // and other stuff...
    };
};

template<>
struct type_traits_T<false> {
    template<auto VAR>
    struct type_traits:
        type_traits_T<true>::type_traits<decltype(VAR)> {};
};

可以很好地工作,并带有宏:

#define type_traits(V) type_traits_T<is_type(V)>::type_traits<V>

上面缺少的部分是is_type(V)部分。

如果is_type(V)是类型,是否有实现true的{​​{1}}的方法,而如果V是变量,则有否方法?如果没有,有没有办法用static reflection proposal来实现?


* 使用模板捕获变量具有其自身的限制。可以通过将对decltype的调用移到宏中来重构它。但是,问题并没有集中在模板部分,在这里只是为了提供一个简单而可行的用例。

解决方法

您可以使用功能模板:

template<typename>
constexpr bool is_type() {
    return true;
}

template<auto>
constexpr bool is_type() {
    return false;
}

#define type_traits(V) type_traits_T<is_type<V>()>::type_traits<V>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...