【问题标题】:C++ static reflection TS: would it support assign/call by name?C++ 静态反射 TS:它会支持按名称分配/调用吗?
【发布时间】:2021-06-11 23:18:50
【问题描述】:

有一个C++ Technical Specification on static reflection(当前PDF draftcppreference page) 可能会进入 C++23 或更高版本。

在目前的草案中是否有可能(我知道语法可能还没有固定) 访问结构字段/按名称调用类成员函数?

例如

struct Test {
  int x;
  int y; 
};

Test foo;

auto meta = reflexpr(foo);  // access meta information about class

some_magic_setter<"x", meta>(foo, 5);  // ??? Should do: `foo.x = 5` 

这可能吗?如果可以,如何?

编辑:当我查看 TS draft 时,我发现大多数函数都被命名为“get_XX”(如 get_typeget_scope、...)或“is_XXX”(如 is_private、. ..) 这似乎只提供信息(这显然是反思的目的)。但是,我找不到任何似乎允许成员访问给定对象的东西。欢迎任何提示。

【问题讨论】:

  • 您是在问TS 是否支持此功能,或者是否可以使用当前标准来完成?对于后者,这是一个骗子stackoverflow.com/questions/41453/…
  • 是的,有可能。
  • @cigien 我只询问 TS。
  • @Yakk-AdamNevraumont 当我查看 TS 时,我发现大多数函数都被命名为“get_XX”(如 get_typeget_scope、...)或“is_XXX”(如 @ 987654332@, ...) 在我看来,这似乎只提供信息(这显然是反思的目的)。但是,我找不到任何似乎允许成员访问给定对象的东西。欢迎任何提示应该如何在 TS 中完成。

标签: c++ reflection c++23


【解决方案1】:

get_pointer&lt;X&gt; 得到一个指向成员的指针,get_name&lt;X&gt; 得到它的名字。加入一些迭代成员(也提供)和类型不匹配的处理(可以在 中完成),鲍勃是你的叔叔。

C++ 提供编译时反射原语;所以据我所知,你必须自己编写胶水代码。

我会从一个函数开始,它使用反射创建一个(名称成员指针)对的元组。可以是纯constexpr

然后是另一个基于该结构进行设置的函数,其中运行时失败正在发挥作用。

这将使您可以分别对两个部分进行单元测试;只有“字典”的构建需要反思。

【讨论】:

  • 我想,这是有道理的。因此,通过给定的指针(指向成员)间接支持成员访问。这几乎可以回答它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2011-04-01
  • 1970-01-01
  • 2011-07-18
  • 2012-09-26
  • 2011-08-26
相关资源
最近更新 更多