将自定义整数包装器转换为布尔值

时间:2014-01-02 22:59:11

标签: c++ boolean type-conversion wrapper

假设我有一个原始C ++类型的自定义包装器:

class myInt
{
    public:
        /*stuff here*/
    private:
        unsigned int data;
}

我该如何制作

myInt mi;  
if(mi){...}  

以正常整数的方式表现吗? 我能想到的只是写一个显式的布尔强制转换,或者可能覆盖operator == 类似的东西:

if(bool(mi)){...}
if(mi.toBool()){...}
if(mi==true){..}

所有这些都符合目的,但看起来非常丑陋和人为 我还缺少另一种选择吗?

2 个答案:

答案 0 :(得分:4)

最好的选择是完全放弃包装。

答案 1 :(得分:3)

您可以制作以下演员操作符,例如:

class myInt
{
    public:
        operator bool() const { return data != 0; }

    private:
        unsigned int data;
}

默认情况下是隐式的(这意味着每次编译器发现它需要一个bool并且你提供了一个myInt时它会被使用)。从c ++ 11开始,您可以将其标记为显式,强制将使用限制为显式强制转换,之后它始终是隐式的。

但是你应该注意到这通常是一个坏主意,应该避免:检查the safe bool idiom以获得更多讲座。

接近你的愿望并且更安全的另一个选择是!运算符的重载:

class myInt
{
    public:
        bool operator!() const { return data == 0; }

    private:
        unsigned int data;
}