c++ - 这个 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可以转换成它?
解决方案
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
,否则返回空指针。
推荐阅读
- android - 为什么 AudioManager 适用于手机,但不适用于 Android TV 模拟器?
- python - 编写此 python 代码的更有效方法是什么?(7个嵌套循环代码耗时太长)
- ios - 展开 Swiftui 视图以覆盖屏幕
- amazon-web-services - 使用 AWS Java SDK 的分段上传在 99% 时挂起
- sql - 如何创建一个仅计算 redshift 上其他列变化的列?
- python - 无法遍历谷歌云笔记本实例中文件夹内的文件
- swift - 在windodDidResize 事件结束时执行函数
- python - 无法使用 MySQL 连接器在 Python 中插入 INT 数据
- kubernetes - TaintManagerEviction - 可能是因为我的 pod 每天获得几次新 IP
- java - 添加一个项目会破坏 getFilter() 方法