【问题标题】:basic C++ grammar about typedef, can anyone explain it?关于typedef的基本C++语法,谁能解释一下?
【发布时间】:2014-02-26 02:02:37
【问题描述】:

我已经阅读了wtf中关于safebool的代码,但是我看不懂语法。

这是来自 webkit 中 wtf 的代码:

    // This conversion operator allows implicit conversion to bool but not to other integer types.
    typedef T* (RefPtr::*UnspecifiedBoolType);
    operator UnspecifiedBoolType() const { return m_ptr ? &RefPtr::m_ptr : 0; }

typedef T* (RefPtr::*UnspecifiedBoolType); 这是什么意思? 我们定义一个新类型还是别的什么?上面的 int 大括号是什么意思?

【问题讨论】:

    标签: c++ webkit


    【解决方案1】:

    你没有给我们完整代码的链接,我希望我找到了这个。行。如果你不知道 typedef 是什么意思,我认为最简单的描述是 cppreference.com,让我引用。

    http://en.cppreference.com/w/cpp/language/typedef

    typedef 声明提供了一种创建别名的方法,该别名可以在任何地方使用 (可能是复杂的)类型名称的位置。

    确实,这是一个不平凡的例子。从现在开始 UnspecifiedBoolType 是类型 T* RefPtr::* 的别名,它是一个“指向成员的指针”。 我将不胜感激提供指向成员指针的良好描述的链接。我很遗憾,但我没有适合初学者的东西。

    类比,但更简单的情况就在这里。 Q 现在是类型 T* my_class::* 的别名,它是指向 Member 的指针。 (检查确认正确)

     template <typename T>
     class my_class {
       typedef T* (my_class::*Q);
       public:
       void check() {
          std::cout << typeid(Q).name() << '\n';
          std::cout << "Q == (T* my_class<T>::*) is " << std::boolalpha 
                    << (typeid(Q) == typeid(T* my_class<T>::*)) << '\n';
         }
      };
    

    它会打印:

      my_class<int> my_object;
      my_object.check();
    

    M8my_classIiEPi

    Q == (T* my_class::*) 是true

    剩下的第二行,你问的。

    operator UnspecifiedBoolType() const { return m_ptr ? &RefPtr::m_ptr : 0; }
    

    据我所知,m_ptr 是一个 T* 类型。 (指向 T 对象的指针。)所以,它是 operator UnspecifiedBoolType() 的定义,它是一个转换函数(它将对象转换为另一种类型的对象,这里是 >RefPtrUnspecifiedBoolType {aka T* RefPtr::*}),这里返回的是指向成员 m_ptr 的指针,当 m_ptr 不是空指针或空时如果是的话。

    如果我不想在没有 typedef 的情况下定义它...

    是一个转换函数,类似这样:

     class my_class {
       bool is_true;
       public:
       operator bool() const { //conversion to bool
         return is_true;
        }
      };
    

    if(object_of_my_class) 为真,当 is_true 为真时,;)(在 object_of_my_class 中)因为如果预期 bool。您正在转换为类型 UnspecifiedBoolType {aka T* RefPtr::*}。还有一个问题。

    // This conversion operator allows implicit conversion to bool but not to other integer types.
    

    上面的函数,虽然只定义为bool转换,但也适用于其他一些类型。在基本示例中,它不是。这是因为指向成员的指针有explicit converse operator (pointer to member conversion)。 “explicit”的好解释就在这里。例如,最后一个代码,如果我们将转换函数编辑为:

     explicit operator bool() const { //conversion to bool only
       return is_true;
      }
    

    现在不允许的是implicit conversion。例如:

     my_class object;
     bool b(object); //Ok, everything is correctly
     //int i(object); //It's illegal!
     //bool b2 = object; //Still illegal.
    

    第一个注释掉的行给我们:

    错误:初始化时无法将“my_class”转换为“int”

    Second 的行为类似。但是你仍然可以这样做:

     bool b3 = bool(object); //or even
     int i2 = bool(object);  //or
     int i3 = static_cast<bool>(object);        //but
     //int i4 = reinterpret_cast<bool>(object); //is still unacceptable.
    

    错误:从“my_class”类型到“bool”类型的无效转换

    原因是施放的时刻。

    【讨论】:

    • @elfylin 如果满意,请接受答案。 ;) 否则,写下缺少的内容。
    • 感谢您的回答。还有一个问题。如果我不想在没有 typedef 的情况下定义它。应该如何定义operator()?
    • 这是正常的转换功能,你照常进行。我弄错了,对不起。我写了示例,转换为布尔值。
    • @tacet 真正的魔力是当您将上述类及其转换运算符强制转换为bool 时会发生什么。当您尝试int 时会发生什么。上面的混乱是模拟 explicit operator bool() 的 pre-C++11 方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2015-12-21
    • 2021-09-12
    相关资源
    最近更新 更多