[英]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 X
中int
类型的数据成员,例如,您可以执行以下操作:
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.