首页 > 解决方案 > 这个 typedef 和转换运算符语法是什么意思?

问题描述

我遇到了一个包含 a 的类,boost::shared_ptr并且无法理解转换运算符的作用以及它的具体工作方式。班上:

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包装指针的有效性,如下所示:

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,它看起来不像函数指针(需要括号?)。它是什么?

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

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

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

标签: c++

解决方案


boost::shared_ptr<int> TestWrapper::*

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

让我们用类数据成员指针举一个更简单的例子:

int X::*

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

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

这是到提到的类数据成员指针类型的转换运算符。

什么是&TestWrapper::internal

internal是类的数据成员的地址TestWrapper

为什么和typedef是同一个类型

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

为什么0可以转换成它

作为指针,您可以分配nullptr给它。或者,就像代码一样,您可以分配0给它。internal此运算符仅在时返回指向数据成员的指针(bool) internal != false,否则返回空指针。


推荐阅读