获取类中的字段数

2024-05-02

有没有办法获取一个类的字段数量?

struct Base {
    char a;
    int b;
};

struct Derived : Base {
    std::string c;
};

static_assert(num_fields<Base>::value == 2);
static_assert(num_fields<Derived>::value == 1);

我找到了这个问题 https://stackoverflow.com/questions/6844605但它已经过时了 - 我希望可以将一些东西与 C++14/17 缝合在一起(毕竟我们现在有类似的东西魔法获取 https://github.com/apolukhin/magic_get- 也许其中的一些子集......?)

EDIT:- 编译器挂钩也可以工作,即使它仅适用于 MSVC 或 GCC 或 Clang - 我使用所有 3 个。


事实上,Antony Polukhin 向我们展示了 C++does自 C++14 起,在不知情的情况下具有(某些)反射;并且您可以提取有关字段的信息。 ...好吧,至少对于普通的旧数据结构/类来说是这样。观看他的 CppCon 2016 演讲:

没有宏、标记或外部工具的 C++14 反射 / Antony Polukhin https://www.youtube.com/watch?v=abdeAew3gmQ

然后你使用:

template <class T>
constexpr std::size_t fields_count() noexcept;

这可以让你得到字段数。要使用它,您需要这两个文件:

https://github.com/apolukhin/magic_get/blob/develop/include/boost/pfr/detail/config.hpp https://github.com/apolukhin/magic_get/blob/develop/include/boost/pfr/detail/config.hpp
https://github.com/apolukhin/magic_get/blob/develop/include/boost/pfr/detail/fields_count.hpp https://github.com/apolukhin/magic_get/blob/develop/include/boost/pfr/detail/fields_count.hpp

这应该足够了。

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

获取类中的字段数 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46

随机推荐

  • 使用 Hilt 提供 Activity 实例

    我该如何翻译这样的内容 Module abstract class BaseActivityModule a Binds abstract fun provideActivity activity A AppCompatActivity c
  • 使用 php 运行 ipconfig 命令

    我使用这段代码来了解访问者 客户 的一些信息 它一直在我的 Xampp 虚拟服务器上运行 但我无法在我的主服务器 主机 上运行 我只看到一个空白页 info system ipconfig all echo info 这可能对你有帮助 服务
  • 将solr 1.4索引升级到solr 3.3?

    我有一个使用 apache solr 1 4 构建的现有索引 我想在 3 3 版本中使用这个现有索引 正如您所知 索引格式在 3 x 之后发生了变化 那么如何才能做到这一点呢 我已经使用 Luke 将现有索引 即 1 4 版本 导出为 XM
  • “完美”的 Python 调试器具有哪些功能? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 请告诉我您希望当前的 Python 调试器具有哪些功能 我正在创建一个新的 Python IDE 调试器 并期待着具有挑战性的请求 请原谅我无耻
  • UIAutomation 嵌套辅助功能元素从层次结构中消失

    我有一个包含两个子视图 一个按钮和一个图像的视图 我打开辅助功能并在子视图上设置标签 我可以通过调用来查看层次结构 UIATarget localTarget frontMostApp mainWindow logElementTree 例
  • jQuery 中children() 或find() 哪个最快?

    要在 jQuery 中选择子节点 可以使用children 也可以使用find 例如 this children foo 给出与以下相同的结果 this find foo 现在 哪个选项最快或首选 为什么 children https ap
  • 如何在 AndroidEnvironment 构建文件的环境变量中指定下载目录的路径

    使用 Visual Studio 2022 17 2 0 Preview 1 0 我目前正在尝试创建一个 MAUI 应用程序 该应用程序已经在 Windows 上运行良好 也可以在 Android 下运行 该应用程序使用一个库 SaxonC
  • 如何使用python将列表填充为0

    我想从另一个列表中获取固定长度的列表 例如 a a b c b 0 0 0 0 0 0 0 0 0 0 我想得到一个这样的列表 a b c 0 0 0 0 0 0 0 换句话说 如果len a lt len b 我要填写清单a使用列表中的值
  • c 中的分叉和管道过程

    所以我有一个项目要做 但我完全被难住了 我花了十个小时却一无所获 我并不是特别想要答案的代码 但是一些伪代码和正确方向的良好提示将有帮助 它分叉多个进程 k 命令行参数 通过管道连接 每个进程都连接到下一个进程 最后一个进程连接到第一个进程
  • 通过 C 将线程固定到 cpuset 中的核心

    我有 cgroup cpuset set1 set1有2 5 8 我想将一个进程绑定到该 cpuset 然后将该进程中的一个线程固定到核心 4 cpuset 的名称 线程名称以及我应该将线程绑定到的核心位于 m 配置文件中 是否有任何 C
  • 可变参数模板

    我看过很多介绍可变参数模板的链接 但我从未见过任何可编译的示例来演示这种方法 有人可以给我提供一些可以找到此类可编译示例的链接吗 最简单的示例之一是以下实现max它甚至没有在类型上进行模板化 int maximum int n return
  • 运行时异常无法在未调用 Looper.prepare 的线程内创建处理程序错误

    我正在尝试上传带有其他一些 EditText 的照片 我从在线示例中获取了示例代码并对其进行了一些编辑 但是 我收到此错误 08 29 21 36 46 000 E AndroidRuntime 4566 FATAL EXCEPTION A
  • TypeError:req.checkBody 不是包含 bodyparser 和expressvalidator 模块的函数

    我收到错误 req checkBody 不是一个函数 我认为我已经包含了express validator和body parser 这是我的代码 var express require express var bodyParser requ
  • Java Linux 非阻塞套接字超时行为

    我有一个 Java 非阻塞服务器 它跟踪选择器中的所有套接字通道 然后我与服务器建立 500 个连接并定期发送数据 服务器接收到的每条数据都会回显给客户端 问题来了 测试工作了几个小时 然后突然逐渐地 服务器管理的所有套接字在尝试读取数据时
  • 工具栏下方的白条

    所以我有一个带有工具栏的应用程序 工具栏下方出现一个白条 最后的屏幕截图 我不希望那个栏在那里我尝试添加 maxHeight 以查看它是否有效 但没有运气 这是我的样式和 v21 style xml style
  • 我怎样才能向下滚动到多行文本框的底线,Javascript的scrollIntoView对此不起作用

    我正在尝试创建一个基本的视频和文本聊天网站 在房间页面中 我有 Flash 视频和一个文本框 多行 其中显示发送到房间的所有消息和一个文本框 供用户通过单击输入和发送旁边的按钮 tr td td tr
  • x 或 y:可接受的习语,还是混淆?

    我必须从可能为 None 的变量中提取值 并考虑一些默认值 我首先写了这段代码 if self maxTiles is None maxX maxY 2 2 else maxX maxY self maxTiles 然后我意识到我可以将其缩
  • 如何以编程方式重新启动 Windows 资源管理器进程

    我正在开发 Windows shell 扩展 不幸的是 在更改 DLL 时 我必须重新启动 Windows 资源管理器 因为它将 DLL 保留在内存中 我从 Dino Esposito 找到了这个程序 但它对我不起作用 void SHShe
  • 如何替换 iOS 6 上 UIWebView 键盘下工具栏上的按钮?

    如何替换工具栏上的按钮UIWebViewiOS 6 上有键盘吗 以下代码在 iOS 5 1 上运行良好 但在 iOS 6 上不起作用 UIWindow keyboardWindow nil for UIWindow testWindow i
  • 获取类中的字段数

    有没有办法获取一个类的字段数量 struct Base char a int b struct Derived Base std string c static assert num fields value 2 static assert