我想了解下面的代码。 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;
}
答案 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
。