UnspecifiedBoolType的类型?关于typedef,成员函数指针和转换运算符

时间:2015-02-10 04:50:10

标签: c++ typedef

我想了解下面的代码。 UnspecifiedBoolType的实际类型是什么?

我很困惑。有谁可以向我解释一下?提前谢谢!

template <typename T>
class MyOptional
{
public:    
    MyOptional() : valueIsSet(false) {}
    MyOptional(const T& value) : valueIsSet(true), value(value) {}

    // Conversion to bool. This is a variant of the "safe bool idiom".
    typedef T MyOptional<T>::*UnspecifiedBoolType;
    inline operator UnspecifiedBoolType() const;

    ...

private:
    bool valueIsSet;
    T value;
};

...

template<typename T>
MyOptional<T>::operator MyOptional<T>::UnspecifiedBoolType() const
{
    return valueIsSet ? &MyOptional<T>::value : 0;
}

2 个答案:

答案 0 :(得分:5)

正如您的代码中的评论所说,这是&#34; safe bool idiom。&#34; &#34;未指定的bool类型&#34;是一种可以在这样的条件表达式中使用的类型:

MyOptional<int> myop;
// ...
if (myop) {
    // ...
}

人们在C ++中这样做的原因是为了防止通过类的转换运算符将bool意外转换为其他类型。例如,如果没有安全的bool习语,你可以这样做:

MyOptional<int> myop;
// ...
int bad = myop; // bad is now zero or one, not the "value" of myop

最后请注意,在C ++ 11中,我们不再需要像这样的模糊代码,因为现在我们有一个语言功能可以让我们写这个:

explicit operator bool();

答案 1 :(得分:1)

typedef T MyOptional<T>::*UnspecifiedBoolType;

UnspecifiedBoolType定义为MyOptional<T>成员变量的指针,其类型为T