创建可以在类型和变量上调用的类型特征 > C++中有两个操作符,可以在类型和变量上调用: siZOS/和 Type ID < /C> > /P>

创建可以在类型和变量上调用的类型特征 > C++中有两个操作符,可以在类型和变量上调用: siZOS/和 Type ID < /C> > /P>,c++,reflection,typetraits,C++,Reflection,Typetraits,假设我们想用类似的行为实现自己的操作,*: 模板 结构类型; 模板 结构类型\u特征\u T{ 模板 结构类型特征{ 使用mydecltype=T; //还有其他东西。。。 }; }; 模板 结构类型\u特征\u T{ 模板 *使用模板捕获变量有其自身的限制。可以通过将对decltype的调用移动到宏中来重构变量。但是,问题并不集中在模板部分,这里的模板部分只是为了提供一个简单可行的用例。您可以使用函数模板: 模板 constexpr bool是_类型(){ 返回true; } 模板 cons

假设我们想用类似的行为实现自己的操作,*:

模板
结构类型;
模板
结构类型\u特征\u T{
模板
结构类型特征{
使用mydecltype=T;
//还有其他东西。。。
};
};
模板
结构类型\u特征\u T{
模板



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

您可以使用函数模板:

模板
constexpr bool是_类型(){
返回true;
}
模板
constexpr bool是_类型(){
返回false;
}
#定义类型特征(V)类型特征:类型特征

您不能将类型传递给函数。如果
v
是类型,则哪个选项为true,否则为false,您是否同意
is\u type\u v
。@NathanOliver它提供了一个具有(false?)的调用语法解决方案可能是一个宏的概念。但是,是的,模板是非常好的,甚至是首选的。刚刚发现这一点,令人震惊的是,没有模板的解决方案也可以工作,因此它更通用,也可以与不能作为模板参数的变量一起工作。
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>