c++ - 指向成员复合的指针
问题描述
我有两个结构
struct A
{
int a, b;
};
struct B
{
A c, d;
};
我想获得一个指向b
内部成员的指针d
。
&B::d.b; // int B::*
我能得到的最接近的是得到它的偏移量。
offsetof(B, d.b) // size_t
但这没有大小或类型信息,所以我能做的最好的就是制作一个宏,将偏移量和类型一起传递,而不是作为int B::*
.
有没有标准的解决方案?有什么非标准的解决方案吗?
在非标准方向上,我正在考虑制作一个模板,用于T<&B::d, &A::b>
重新解释偏移量并将它们添加在一起,但我不确定如何进行重新解释部分。
我在 macOS 上使用 c++17 和最新的 Xcode clang。
解决方案
您可以使用两个成员指针:
int A::* foo = &A::b;
A B::* bar = &B::d;
B objB;
int& db = objB.*bar.*foo;
缺点是每个偏移量都是单独存储的,如果在运行时完成,这将不必要地低效。不过对于编译时元编程应该没问题。
推荐阅读
- c# - 用于 Angular 前端的 ASP.NET Core 标识和 Web API
- c# - WCF - 如何将自定义 System.ServiceModel.Security.SecurityAlgorithmSuite 与自定义绑定一起使用
- python - (Python) 将日志数据处理成时间序列
- database - mongo 聚合 $lookup 与数组
- docker - 将 nginx 添加到我的 dockerized Django 应用程序
- java - 将 Avro GenericRecord 转换为 SpecificData 对象,同时将 Long 转换为 Instant
- c# - 将继承类中的对象绑定到组合框c#
- java - ClassCastException:无法转换为类,并且位于加载程序“app”的未命名模块中
- javascript - compondentDidMount 参数未定义,无法执行
- javascript - 如何从 LocalStorage 中删除数组项并在 JavaScript 中更新 UI?