从对象及其成员的地址获取指向成员的指针
Obtaining a pointer-to-member from addresses of an object and its member
我希望反转.*
运算符。
当我有一个指针时,我可以用*
取消引用它,然后从取消引用的值返回到指针&
运算符。
使用指向成员的指针,我可以使用运算符(提供对象实例(取消引用它.*
但没有运算符可以从对象及其取消引用的字段中获取原始指向成员的指针。
请考虑以下数据结构:
struct Point { double x, y, z; };
现在我需要从(Point&, double&)
对中获取指向成员double Point::*
的指针,其中该double &
是Point&
对象的字段。
换句话说,我需要一个函数to_member_ptr
这样:
template<typename DataType, typename Member>
constexpr Member DataType::* obtain_member_ptr(const DataType &that, const Member &fieldInThat);
int main(int, char*[]) {
Point pt;
static_assert(obtain_member_ptr(pt, pt.x) == &Point::x, "error");
static_assert(obtain_member_ptr(pt, pt.y) == &Point::y, "error");
static_assert(obtain_member_ptr(pt, pt.z) == &Point::z, "error");
}
我可以为给定的数据类型手写它,如下所示:
constexpr double Point::* obtain_member_ptr(const Point &that, const double &fieldInThat) {
if(&that.x == &fieldInThat) return &Point::x;
if(&that.y == &fieldInThat) return &Point::y;
if(&that.z == &fieldInThat) return &Point::z;
return nullptr;
}
但这似乎是一个普通的样板,我觉得应该有一种方法可以让编译器为我做到这一点。
如何从对象及其字段中可移植地获取指向对象的指针?
使用 visit_struct,您可以先添加反射:
struct Point { double x, y, z; };
VISITABLE_STRUCT(Point, x, y, z);
然后访问您的结构:
template <typename C, typename T>
struct MemberPtrGetter
{
constexpr MemberPtrGetter(const C& c, const T& field) : c(c), field(field) {}
// Correct type, check reference.
constexpr void operator() (const char* name, T C::*member) const
{
if (&(c.*member) == &field)
{
res = member;
}
}
// other field type -> ignore
template <typename U> constexpr void operator() (const char* , U C::*member) const {}
const C& c;
const Member& field;
Member C::* res = nullptr;
};
template<typename C, typename T>
constexpr T C::* obtain_member_ptr(const C& c, const T& field)
{
MemberPtrGetter<C, T> visitor{c, field};
visit_struct::apply_visitor<C>(visitor);
return visitor.res;
}
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 我可以给派生类中基类的成员取别名吗
- 取参考成员(非 POD)的偏移量
- C++:std::bind() 如何"知道"模板参数是指静态函数还是成员函数?