繁体   English   中英

这个 typedef 和转换运算符语法是什么意思?

[英]What does this typedef and conversion operator syntax mean?

我遇到了一个包含boost::shared_ptr的 class 并且无法理解转换运算符的作用及其具体工作方式。 class:

class TestWrapper {
public:
    explicit TestWrapper(int* ptr) : internal(ptr) {}


    typedef boost::shared_ptr<int> TestWrapper::* safe_bool;

    boost::shared_ptr<int> internal;

    bool operator!() { return !internal; }
    operator safe_bool() const { return internal ? &TestWrapper::internal : 0; }
};

该代码使类似以下的测试工作,就好像它们正在测试包装指针的null ness,如下所示:

TestWrapper t(new int(5));

if(!t) {
    std::cout << "!null" << std::endl;
}

if(t) {
    std::cout << "null" << std::endl;
}

但是,我一直无法理解 typedef 的含义:

typedef boost::shared_ptr<int> TestWrapper::* safe_bool;

它看起来不像boost::shared_ptr的重命名,它看起来不像 function 指针(需要括号?)。 它是什么?

我也无法弄清楚转换运算符的含义:

operator safe_bool() const { return internal ? &TestWrapper::internal : 0; }

&TestWrapper::internal是什么? 为什么它与typedef类型相同? 为什么0可以转换成它?

boost::shared_ptr<int> TestWrapper::*

这是一个 class 数据成员指针。 它指向来自 class TestWrapper类型boost::shared_ptr<int>的数据成员

让我们用 class 数据成员指针给出一个更简单的示例:

int X::*

这是一个 class 数据成员指针,指向 class Xint类型的数据成员,例如,您可以执行以下操作:

struct X
{
    int a;
    int b;
    float c;
};

struct Y
{
    int a;
};

auto test()
{
    using T = int X::*; // a pointer to an int data member of class X

    X x1{1, 2};
    X x2{100, 200};

    T pa = &X::a;       // pointer to data member a of class X
    T pb = &X::b;       // pointer to data member b of class X

    T pc = &X::c;  // illegal
    T py = &Y::a;  // illegal

    std::cout << x1.*pa; // 1
    std::cout << x1.*pb; // 2

    std::cout << x2.*pa; // 100
    std::cout << x2.*pb; // 200

}

operator safe_bool() const

这是对上述 class 数据成员指针类型的转换运算符。

什么是&TestWrapper::internal

是class TestWrapper internal数据成员的地址

为什么和typedef是同一个类型

因为 internal 是 class TestWrapper 的boost::shared_ptr<int>类型的TestWrapper数据成员

为什么0可以转换成它

作为指针,您可以将nullptr分配给它。 或者,正如代码所做的那样,您可以为其分配0 此运算符仅在(bool) internal != false时返回指向数据成员internal的指针,否则返回 null 指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM