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 没有成员?
是否有办法获得我想要的功能,或者需要编码不同的功能?
(请注意,这只是一个示例,我的代码包含更大的结构,比仅仅编写第二个函数可以节省更多时间。)
谢谢!
您不能创建指向成员的指针(语言禁止这样做)。但是,您可以一直访问指向成员的指针。
如果我们使用不断调用指向成员的指针的递归函数来概括访问:
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)