类在编译时隐式转换为整数类型(最好是bool)

时间:2013-06-15 22:20:10

标签: c++ templates c++11 template-meta-programming

我们有一个整数值包装器。例如,一个布尔包装器,如std::true_typestd::false_type

template<typename T , T VALUE>
struct integral_value_wrapper
{
    static const T value = VALUE;
};

template<bool VALUE>
using boolean_wrapper = integral_value_wrapper<bool,VALUE>;

using true_wrapper  = boolean_wrapper<true>;
using false_wrapper = boolean_wrapper<false>;

我们为自己的类使用boolean包装器。例如,一个int检查器:

template<typename T>
struct is_int : public false_wrapper {};

template<>
struct is_int<int> : public true_wrapper {};


using type = int;

int main()
{
    if( is_int<type>::value ) cout << "type is int" << endl;
}

我的问题是:有没有办法让一个类型(在这种情况下继承自bool包装的类)隐式转换为整数值?

这允许我避免在布尔表达式中使用::value成员,如下例所示:

using type = int;

int main()
{
    if( is_int<type> ) cout << "type is int" << endl;  //How I can do that?
}

1 个答案:

答案 0 :(得分:2)

您无法提供需要表达式的类型。但是,如果您将转换运算符添加到包装器中,如下所示:

template<typename T , T VALUE>
struct integral_value_wrapper
{
    static constexpr T value = VALUE;
    constexpr operator T () const { return value; }
};

然后你可以写:

if ( is_int<type>() )
//               ^^

标准类型特征的作用是什么。