如何在编译时计算类成员的偏移量?

2024-01-09

给定 C++ 中的类定义

class A
{
  public:
    //methods definition
    ....

  private:
    int i;
    char *str;
    ....
}

是否可以使用 C++ 模板元编程在编译时计算类成员的偏移量?该类不是 POD,并且可以具有虚拟方法、基元和对象数据成员。


基于 Matthieu M. 的答案,但更短且没有宏:

template<typename T, typename U> constexpr size_t offsetOf(U T::*member)
{
    return (char*)&((T*)nullptr->*member) - (char*)nullptr;
}

它的名字是这样的:

struct X { int a, b, c, d; }

std::cout << "offset of c in X == " << offsetOf(&X::c);

Edit:

杰森·赖斯是对的。这不会在 C++11 中产生实际的常量表达式。鉴于限制,这看起来不可能http://en.cppreference.com/w/cpp/language/constant_expression http://en.cppreference.com/w/cpp/language/constant_expression-- 特别是没有指针差异和reinterpret_cast可以在常量表达式中。

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

如何在编译时计算类成员的偏移量? 的相关文章

  • 使用预编译头减少 clang 编译时间

    我正在开发一个数据库项目 该项目将查询 以某种高级语言表示 编译为 C 代码 这段代码由数据库编译并执行 那部分工作得很好 现在 我正在尝试减少 C 查询代码的编译时间 我想知道是否可以使用预编译头来提高性能 该查询被转换为一个名为 Que
  • Symfony2 Twig 扩展

    我在实现树枝扩展时遇到一些问题 我需要创建自己的过滤器 子过滤器 所以我想到了使用twig扩展 我在 MyApp Bundle WebsiteBundle 和文件上创建了一个名为 Extension 的文件夹 网站扩展 php namesp
  • 将conf文件嵌入到helm图表中

    我是新掌舵者 我正在构建一个包含大量conf文件的splunk helm图表 我目前在 configmap 中使用类似的东西 apiVersion v1 kind ConfigMap metadata name splunk master
  • 在不使用 ncurses 的情况下用 C/C++ 编写“真正的”交互式终端程序,例如 vim、htop...

    不 我不想使用ncurses 因为我想了解如何 终端可以工作 并且我自己编程也很有趣 没有 必须是可移植的 它必须只能在基于 linux xterm 的终端仿真器上工作 我想做的是编写一个交互式终端应用程序 例如 htop 和 vim 我的
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • 命名空间“Microsoft”中不存在类型或命名空间名称“Practices”

    我正在使用 Microsoft Visual Studio 2005 for c 我的代码中有以下命名空间 using Microsoft Practices EnterpriseLibrary using Microsoft Practi
  • 函数参数评估顺序[重复]

    这个问题在这里已经有答案了 在 C 和 C 中 函数参数的求值是否有固定的顺序 我的意思是 标准怎么说 是吗left to right or right to left 我从书中得到的信息令人困惑 是否有必要function call应该使
  • 如何填充两个样条线或直线系列之间的区域

    我有这个Chart 如何填充两个之间的区域Series S0 and S1 说蓝色和黄色Series 为此 我们编写了其中之一Paint事件 这里的ValueToPixelPosition https msdn microsoft com
  • C++ 错误:从“char”到“const char*”的转换无效

    我对 C 完全陌生 我创建了这个函数 bool guessWord string compWord cout lt lt Guess a letter string userLetter cin gt gt userLetter for u
  • TreeView:仅在子节点中存在复选框

    我需要一个树视图控件 根节点没有复选框 只有图像 所有子节点都有一个复选框 图像 C net 2 0 winforms 不是 wpf WinForms树视图默认不支持混合复选框 非复选框节点 您可以在树视图上全局启用复选框 并使用以下命令在
  • 如何解决内存碎片

    我们偶尔会遇到这样的问题 长时间运行的服务器进程 在 Windows Server 2003 上运行 由于内存分配失败而引发异常 我们怀疑这些分配由于内存碎片而失败 因此 我们一直在寻找一些可能对我们有帮助的替代内存分配机制 我希望有人能告
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 为什么调试器只显示数组指针中的一个元素?

    首先 我知道new是执行此操作的 C 方法 我只是表明有不止一种方法可以重现此错误 而且两种方法都令人难以置信的令人沮丧 我有两种形式的源文件 我正在尝试调试另一个编程作业 但我并没有寻求帮助 基本上 我正在尝试重新实施set作为一个类 具
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s
  • 扔掉挥发物安全吗?

    大多数时候 我都是这样做的 class a public a i 100 OK delete int j Compiler happy But is it safe The following code will lead compilat
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list
  • 如何从尖点库矩阵格式获取原始指针

    我需要从尖点库矩阵格式获取原始指针 例如 cusp coo matrix

随机推荐

  • Flutter中是否可以使用JS可视化库(例如Chart.js或D3.js)?

    如果可能的话 它到底是如何运作的 也许可以访问 Flutter 的Canvas https api flutter dev flutter dart ui Canvas class html通过JS小部件 我对此最好的猜测是flutter
  • JNI 环境指针

    我有一个 Java 类 其中有一个必须从 C 代码调用的函数 函数如下 public void endTrial Code 所以我在我的 C 文件中创建了以下代码 JNIEXPORT void JNICALL package endTria
  • 获取 post_save 信号中字段的先前值

    我在 django 中有一个 post 信号 我需要访问字段的先前值 post save connect callback function postsave sender Media 我知道理想情况下我应该使用 pre save pre
  • UITableView reloadData() 不刷新显示的单元格

    I have class StationViewController UITableViewController UITableViewDelegate UITableViewDataSource IBOutlet var stationT
  • 包括所有依赖项

    我刚刚开始使用 WiX 因为我需要能够在我们的 CI 服务器上自动构建 MSI 有没有办法自动包含项目的所有依赖项 heat exe 的 proj 扩展变得越来越好 Heat http wixtoolset org documentatio
  • 对命名实体使用(NLP)门工具[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我可以使用GATE吗http gate ac uk http gate ac uk 在我的java程序中提取命名实体 如果是 您能否举
  • sphinx-build 失败 - autodoc 无法导入/查找模块

    我正在尝试开始使用 Sphinx 但似乎遇到了无情的问题 命令 docs sphinx quickstart 我回答了所有问题 一切正常 命令 docs ls 一切看起来都很正常 结果 build Makefile source 命令 sp
  • 改变网格的不透明度会产生“淡入”效果吗?

    我在创建网格淡入淡出效果时遇到一些问题 我想要点击后出现一个网格 这可能吗 Thanks 参加派对有点晚了 因为我刚刚写的与隐士戴夫几乎相同 但也许它有助于更 好地理解 另一种方法是 在 XAML 视图中设置 Storyboard 项 在我
  • 正则表达式不允许使用字符,除非转义

    下面是我的正则表达式来解析逗号分隔的键值对 function extractParams str var result str replace s s s s g function a b result a trim b trim retu
  • 如何在 Ruby 中创建双向 SSL 套接字

    我正在构建一个客户端 Ruby 库 它连接到服务器并等待数据 但也允许用户通过调用方法发送数据 我使用的机制是有一个初始化套接字对的类 如下所示 def initialize pipe r pipe w Socket pair UNIX S
  • 无法删除目录 ACE

    我正在使用 C 和 NET 4 编写一个类库 它通过网络与共享服务器上的文件系统进行交互 我正在尝试调整文件夹的某些权限 并且我完全有能力添加 ACE 但我很难删除它们 这是我到目前为止的代码 get ACEs for the workin
  • JPA 多线程 org.eclipse.persistence.exceptions.ConcurrencyException

    嗨 我尝试使用多线程JSOUP and JPA解析一些页面并将信息放入数据库中 但有时我会遇到此异常 Exception in thread Thread 7 Local Exception Stack Exception EclipseL
  • 多线程和递归结合在一起

    我有递归代码以深度优先的方式处理树结构 代码基本上是这样的 function TreeNode curr if curr children null curr children isEmpty for TreeNode n curr chi
  • ReST 低延迟 - 在上传待处理时我应该如何回复 GET?

    我正在设计一个ReST https restfulapi net 遵循基本的APICRUD https en wikipedia org wiki Create read update and delete图案 我的 API 可以接收更新资
  • 使用 linq2xml 订购 xml 文件

    以下问题使用 LINQ2XML 过滤 xml https stackoverflow com questions 11006160 filter xml with linq2xml 从 xml 文件成功过滤 删除节点 后 我想按节点中的某些
  • ASP.net 很好地渲染 HTML(美化)

    当我在 ASP net 中生成控件时 它们的结果如下 div class discussWrapper span class cbox highlighted span div
  • java.lang.IllegalArgumentException:解密图像时错误的base-64

    我正在使用 Jsoup 解析器选择图像 Elements images document select img String src images attr src 然后使用这段代码来摆脱data image jpg base64 pure
  • 温斯顿记录器名称

    Flatiron 的日志记录库 Winston 非常有用 但我不知道如何为记录器分配名称 我期待与其他日志库类似的输出 例如
  • Twitter Bootstrap TreeView 插件 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道 twitter bootstrap 中树视图的成熟插件吗 到目前为止我发现的大多数东西是 a
  • 如何在编译时计算类成员的偏移量?

    给定 C 中的类定义 class A public methods definition private int i char str 是否可以使用 C 模板元编程在编译时计算类成员的偏移量 该类不是 POD 并且可以具有虚拟方法 基元和对