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

3

假设我们有一个整数值的包装器。例如,一个布尔包装器像 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>;

我们在自己的类中使用布尔封装器。例如,一个整数检查器:
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个回答

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>() )
//               ^^

这就是标准类型特征所做的事情。

好的,谢谢。真正使用一个值的包装器来像使用一个值一样使用它听起来有点...循环?我正在寻找更清晰的语法。非常感谢。 - Manu343726
@Manu343726:没问题,很高兴我能帮到你——至少部分地。 - Andy Prowl
我又再次阅读了这篇文章。希望现在我们有C++14的模板别名! - Manu343726
@Manu343726:别名模板已经是C++11的一部分,并且目前得到了所有主要编译器供应商的支持。 - Andy Prowl
哦,抱歉有误,我是指C++14模板变量 - Manu343726
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接