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

标签 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;
}

最佳答案

正如代码中的注释所说,这是“safe bool idiom”。 “未指定的 bool 类型”是一种可以在条件表达式中使用的类型,如下所示:

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

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

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

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

explicit operator bool();

关于c++ - UnspecifiedBoolType 的类型?关于typedef、成员函数指针和转换运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28424356/

相关文章:

类中的 C++ typedef

c++ - 如何在两个类型定义 vector 上使用指针进行访问

c++ - 为什么 Scott Meyers 建议更喜欢 `iterator` 而不是 `const_iterator`

c++ - 如何在Excel Chart中禁用自动创建SeriesCollection

c++ - 用于 C# 的托管 C++ 代码

带括号的 C++ 非函数 typedef

C++ 模板类型在 typedef 工作的地方中断

c - 探索 'typedef' 以创建有限的字符串数据类型?

c++ - 适用于 Windows 的可移植 C/C++ 应用程序的 DLL 依赖项

c++ - 使用 Poppler Qt4 c++