gpt4 book ai didi

c++ - 如何在 C++ 中将成员变量指针转换为泛型类型

转载 作者:搜寻专家 更新时间:2023-10-30 23:50:59 24 4
gpt4 key购买 nike

我的应用程序中有类似的代码:

class A
{
public: int b;
}

class C
{
public: int d;
}

void DoThings (void *arg1, MYSTERYTYPE arg2);

A obj_a;
C obj_c;

DoThings(&obj_a, &A::b);
DoThings(&obj_c, &C::d);

问题是 - MYSTERYTYPE 应该是什么? void* 和 int 都不起作用,尽管如果您通过 printf 输出值 &A::b 打印得很好。

澄清:是的,&A::b 是在 C++ 下定义的。是的,我正在尝试获取类成员的偏移量。是的,我很狡猾。

编辑:哦,我可以使用 offsetof()。无论如何谢谢。

最佳答案

您有一个指向两个不相关类的数据成员指针。好吧,您找不到可以容纳两个指针的通用类型。它仅在函数参数是指向派生成员的数据成员指针时才有效,因为它保证也包含该成员,如果基类包含它:

struct a { int c; }; struct b : a { }; int main() { int b::*d = &a::c; }

更新:我想我应该写下为什么上面的代码会从 a::* 隐式转换为 b::*。毕竟,我们通常有 b*a* !考虑:

struct a { };
struct b : a { int c; };
struct e : a { };
int main() { int a::*d = &b::c; e e_; (e_.*d) = 10; /* oops! */ }

如果以上内容有效,那你真的会搞砸了。以上是有效的,因为从b::*a::* 的转换不是隐式的。如您所见,我们分配了一个指向 b::c 的指针,然后我们可以使用一个根本不包含它的类取消引用它! (e)。编译器强制执行此顺序:

int main() { int b::*d = &b::c; e e_; (e_.*d) = 10; /* bug! */ }

现在编译失败,因为e不是从成员指针指针所属的类b派生的。好的!然而,以下是非常有效的,当然可以编译(更改类 ab):

struct a { int c; };
struct b : a { };
struct e : a { };
int main() { int e::*d = &a::c; e e_; (e_.*d) = 10; /* works! */ }

要使其适合您的情况,您必须将您的函数设为模板:

template<typename Class>
void DoThings (int Class::*arg) { /* do something with arg... */ }

现在,编译器将自动推断给定成员指针所属的正确类。您必须将实例与成员指针一起传递才能实际使用它:

template<typename Class>
void DoThings (Class & t, int Class::*arg) {
/* do something with arg... */
(t.*arg) = 10;
}

如果你只是想设置一些你在编写 DoThings 时已经知道的成员,以下就足够了:

template<typename Class>
void DoThings (Class & t) {
t.c = 10;
}

关于c++ - 如何在 C++ 中将成员变量指针转换为泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/420726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com