3

结合if constexpr一些<type_traits>实体,在 C++17 中,我能够在编译时检查类型。这些技术可以被认为是静态反射吗?还是只是类型检查?例子:

if constexpr (std::is_same_v<T, U>) statement

反射概念是否仅适用于运行时?称其为静态反射是否正确?

4

2 回答 2

7

可以is_same认为是静态反射的一种形式吗?它实际上是静态的,是一种类型的编译时可检测属性。实际上,您可以编写将基于自省此属性执行的代码。所以从技术上讲,称之为“反射”是完全正确的。

但是,如果您要对单词有用,如果您想有效地使用单词进行交流,那么您必须认识到字典定义并不完全有用。这是因为人们有不同的字典,对单词的含义有不同的期望。单词可以改变它们的含义或在不同的上下文中具有特殊的含义。因此,如果您要有效地与人交流,您必须使用能够真正传达您打算交流的意思的词语。

特别是,C++ 上下文中的“静态反射”一词通常指的是与此提案 (PDF)(巧妙地命名为“静态反射”)及其许多、许多修订相关的功能。具体来说,如果您声称 C++ 具有“静态反射”作为某种语言特性,那么对于许多 C++ 用户来说,您就是在声称用户可以做一些事情,比如枚举类的属性(比如一个类的成员子对象) type) 并遍历它们,对每个此类属性执行一些操作。

毕竟,这就是你可以在其他语言中做的事情,这些语言将反射作为一流的特性。“反射”不仅仅是能够询问给定类型是否是特定类型,或者给定类型是否满足基本属性。反射是关于能够自省几乎每个类型感兴趣的方面。

这就是术语“静态反射”给许多 C++ 程序员的期望。当 C++ 程序员谈论想要“静态反射”时,就是他们想要的。

因此,虽然您可以在技术上声称 C++ 已经具有“静态反射”,但提出这样的声明是没有用的。

于 2019-10-01T04:31:13.433 回答
2

我会说是的,反射可以在编译时完成(给出静态反射)的基本思想是完全合理的。事实上,一段时间以来,已经有很多关于 C++ 中的静态反射的论文。举一个明显的例子,考虑N3996:静态反射

事实上,C++ 委员会有一个官方研究组 (SG 7),它现在涵盖了一般的编译时编程,但最初致力于静态反射。

现在关于static if某些类型特征是否符合静态反射的条件,我会说答案是“是”,但有一些相当严格的条件,或者至少有限制。例如,static if使用类型特征可能不足以实现上面链接的论文中显示的任何激励示例。

尽管如此,它确实允许一些最小程度的反射,并且它是在编译时完成的,所以它显然是静态反射。

于 2019-10-01T04:00:53.450 回答