访问结构成员的模板函数

Chr*_*ter 4 c++ templates struct

我有一个包含其他结构以及原始数据类型的结构。我希望能够使用模板函数访问每个成员,包括主结构中包含的结构的成员。

例如:

struct B {
    int y;
    int z;
};

struct A {
    int x;
    B b;
};

template <typename TMember>
bool doSomething(A *a, TMember member) {

    a->*member = 5;  // some code accessing member

}

// Then access it with:

doSomething(&myA, &A::x);

// and likewise

doSomething(&myA, &A::b.y);
Run Code Online (Sandbox Code Playgroud)

但是,第二个不会编译并抛出“引用中缺少对象”错误。我认为这是因为 A 没有成员?

是否有办法获得我想要的功能,或者需要编码不同的功能?

(请注意,这只是一个示例,我的代码包含更大的结构,比仅仅编写第二个函数可以节省更多时间。)

谢谢!

Bar*_*rry 5

您不能创建指向成员的指针(语言禁止这样做)。但是,您可以一直访问指向成员的指针。

如果我们使用不断调用指向成员的指针的递归函数来概括访问:

template <typename C, typename T>
decltype(auto) access(C& cls, T C::*member) {
    return (cls.*member);
}

template <typename C, typename T, typename... Mems>
decltype(auto) access(C& cls, T C::*member, Mems... rest) {
    return access((cls.*member), rest...);
}
Run Code Online (Sandbox Code Playgroud)

然后我们可以编写doSomething获取任意数量的指针:

template <typename... Members>
void doSomething(A *a, Members... mems) {
    access(*a, mems...) = 5;
}
Run Code Online (Sandbox Code Playgroud)

并称其为:

A myA;
doSomething(&myA, &A::x);
doSomething(&myA, &A::b, &B::y);
Run Code Online (Sandbox Code Playgroud)