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

2024-03-11

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

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; }

Update:我想我应该写为什么上面的转换a::* to b::*隐含地。毕竟我们平时都有b* to a*!考虑:

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

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

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

It fails现在编译,因为e不是源自b,成员指针指针所属的类。好的!然而,以下内容是非常有效的并且当然可以编译(更改了类a and b):

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C++ 中将成员变量指针转换为泛型类型 的相关文章

随机推荐

  • 如何配置 virtualenvwrapper 与 pyenv 一起使用

    我正在尝试设置我的 imac mavericks 以便能够轻松切换到不同版本的 python 我使用 rbenv 成功地为 Ruby 项目完成了此操作 并发现 pyenv 正是我在这方面所寻找的 我遇到的问题是使用 pyenv 创建虚拟环境
  • 如何在 git 存储库的特定状态下显示文件的内容?

    我想显示 git 存储库特定状态下的路径给出的文件的内容 我没有成功尝试这个 git show f825334150cd4bc8f46656b2daa8fa1e92f7796d Katana source Git GitLocalBranc
  • 如何使用 IEnumerable<> 类型创建 CodeFunction2?

    我确实需要创建如下所示的内容 我正在构建 2 个类 第一个类是名称为 tableNameAsSingular 即 AddressEntity 的类 在我的第二个工作类中 我需要具有如下所示的内容 public IEnumerable
  • 计时器和 JFrame 错误

    我正在制作一个带有计时器和 JFrame 的游戏 以及许多其他东西 但只有这两个会引起问题 在运行下面的片段后 我收到了一个奇怪的错误 至少对于之前从未使用过这些类的我来说是这样 开始执行这个 private static GameView
  • Java 使用 Math.ceil 向上舍入为 int

    int total int Math ceil 157 32 为什么它仍然返回4 157 32 4 90625 我需要四舍五入 我环顾四周 这似乎是正确的方法 I tried total as double输入 但得到 4 0 我究竟做错了
  • 查找一组字符串中 K 个最长的公共后缀

    我想在一组字符串中找到最长的常见后缀 以检测我的自然语言处理项目中的一些潜在的重要语素 给定频率K gt 2 在字符串列表中找到K个最常见的最长后缀S1 S2 S3 SN 为了简化问题 这里举一些例子 Input1 K 2 S firema
  • 确定按下“Backspace”按钮

    How to determine in GWT that user pressed Backspace button I tried this but it does not work Override public void onKeyP
  • zip mime 类型,何时选择哪一种

    到目前为止 对于 Zip 文件的 Mime 类型 我已经看到 应用程序 八位字节流 多部分 x zip 应用程序 zip 应用程序 zip压缩 应用程序 x zip 压缩 我想我的问题是哪个是 最好的 为什么 为什么有这么多选择 我使用 w
  • System.Timers.Timer Elapsed 事件在调用timer.Stop()后执行

    背景 我有一个计时器 用于跟踪自串行端口数据接收事件被触发以来已经过去了多长时间 我正在为此创建自己的解决方案 而不是使用内置的超时事件 因为我正在获取连续的数据流 而不是发送查询并获取一个响应 问题 在 DataReceived 处理程序
  • HTML - 给定一个表格,如何在不破坏布局的情况下允许一列流动

    我有以下内容 div style width 100 table tr td style width 30px hi td td style width 40px hi td td style width 1 LOTS Of text in
  • whitespaceAndNewlineCharacterSet() 中有哪些字符?

    我正在解析一些讨厌的文件 你知道 在一个文件中混合逗号 空格和制表符分隔符单线 然后通过文本编辑器运行它 该编辑器会在第 65 列用 CRLF 换行 啊 作为我在 Cocoa 中解析此内容的努力的一部分 我使用 Apple 的whitesp
  • 验证传递给 Mock 的参数是否按预期设置的正确方法

    如果您稍后验证调用了这些方法 是否可以在回调中进行断言 这是确保我的模拟获得传递给它的预期参数的首选方法 还是应该在回调中设置局部变量并在该实例上执行断言 我遇到的情况是 Presenter 类中有一些逻辑 它根据输入派生值并将它们传递给
  • 在 R 中使用 persp3D 函数时,如何向轴标签添加下标?

    I am trying to define my z axis label as R0 in plot3D below are my code I am using expression for my zlab but I get the
  • 错误:文件已加密或不是数据库

    我使用 PHP 创建了一个带有表的数据库 我通过以下方式做到了 从命令行执行 PHP 文件 php test php 后 我在目录中得到一个名为 test db 的新文件 这就是我想要的 然后 在命令行中 我输入 sqlite3 test
  • em 与 px...针对移动浏览器

    对于桌面浏览器 所有现代浏览器都使用缩放功能 因此我们可以使用 PX 但如果可以在移动设备上看到相同的站点 那么 px 不适合在移动浏览器中缩放 或者使用 px 对于移动浏览器也很好 即使我们不关心 IE 6 如果我们不为移动设备制作不同的
  • 如何在cassandra中构建范围查询?

    CREATE TABLE users userID uuid firstname text lastname text state text zip int age int PRIMARY KEY userID 我想构造以下查询 selec
  • 独立 Java SE 应用程序的项目目录结构是什么?

    独立 Java SE 基于命令行 应用程序的标准项目目录结构是什么 src文件夹将包含我的所有 java正确组织的包中的文件 除此之外我还有bin文件夹将包含我的 class files 我的项目中有属性文件和 XML 配置文件 我应该将它
  • 使用 .htaccess 通过 index.php 重新路由除一组特定请求之外的所有请求

    所以我只是继承了一个网站 我想做的第一件事是构建一个漂亮的小标准 简单易用的 CMS 允许使用任何 URL 创建页面 例如 whatever html 因此 如果用户点击 example com whatever html 它应该获取wha
  • Android Webview - 当用户滚动时检测标题名称

    我有这种模式的 html 文件 a a h2 First Heading h2 a Some Text goes here a br br a a h2 Second Heading h2 Some Text goes here br br
  • 如何在 C++ 中将成员变量指针转换为泛型类型

    我的应用程序中有与此类似的代码 class A public int b class C public int d void DoThings void arg1 MYSTERYTYPE arg2 A obj a C obj c DoThi