【问题标题】:Compile-time reflection in C++1z? [closed]C ++ 1z中的编译时反射? [关闭]
【发布时间】:2014-04-08 00:32:30
【问题描述】:

C++ 标准化委员会中有一个研究小组提供 C++1z 或更高版本的编译时反射。我想知道具体目的是什么以及预期的工具会有多强大?

例如,是否可以使用这些工具命名函数或类?

struct A {int f() {return 42;}};
struct B {int (std::reflect<A>::member<0>::declname)() {return 43;}};
// equivalent to struct B {int f() {return 43;}};

如果它没有这么强大,典型的用例会是什么?

【问题讨论】:

  • 它仍处于非常早期的阶段。你能做的最好的就是look at what people are proposing
  • @JosephMansfield 我已经看过了,但由于我不知道学习组的“历史”,我不确定什么是“他们的终极梦想”......
  • 我想他们也不知道。
  • 有人否决了这个问题... wtf!它可能不会在编码中添加任何内容,但我确信在编译时从 static_assert 访问 enumerator_list 并不是什么新鲜事。这是一个很棒的功能。未来看起来很光明
  • 这个问题似乎是题外话,因为它是关于推测的。它属于std-proposals 论坛。

标签: c++ reflection standard-library c++17


【解决方案1】:

N3814 中概述了反射用例:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3814.html

一般的观点是,我们将把它作为 N3815 示例的 Type Traits 库的扩展:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3815.html

反思有两个部分。第一个是内省。获取一个实体并查询它的常量值。第二个是reification,正好相反——使用值来创建新的实体。

对于自省 - 您可以期待额外的特征,这些特征将允许您在编译时枚举和获取类成员、基类、枚举器、函数参数等的名称。从那里您可以将它们用于序列化、成员操作、静态检查和其他各种事情。

另外,稍后我们将研究具体化,这将涉及从常量值创建新实体,比使用模板更具表现力。所以也许你可以填写一个std::class_specifier s 结构然后调用make_type_from_spec(s) 来创建类型。

内省的方法目前有更多的共识,具体化方面更远。

【讨论】:

  • 我不确定你所说的“物化”。我的小例子是具体化的例子吗(将编译时字符串重新解释为函数的名称?)
  • 编译时间与运行时间一样宝贵,并且有可能变得更有价值。 Boost Static Assert 在过去帮了我很多,但另一方面,概念检查却不容易消化和实施。您列出的这些功能看起来像是对 c++ 的巨大增值
  • @Vincent:是的,创建一个名称是编译时字符串而不是标识符标记的新实体,我认为这是具体化的一部分。我认为我们将能够在编写标识符之前读取标识符(例如 N3815 中的标识符)。
  • 好的,我看到了使用自省+物化+模板元编程的库开发的光明未来......
  • @NoSenseEtAl:是的。如果您查看 N3815 中的示例代码,您可以看到如何从给定的特征到枚举类型的枚举数的 for 循环。我目前正在为班级成员研究类似的特征,因此您将能够遍历班级成员。当然,类成员具有异构类型,因此“循环”就像循环 std::tuple 的元素一样——它不能是这样的 for 循环——但你将能够获得与做某事相同的效果为每个班级成员。
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 2017-03-26
  • 2010-09-17
  • 2011-09-02
  • 2019-12-17
  • 2017-06-12
相关资源
最近更新 更多