C++ 17 有静态反射吗?
Does C++ 17 have static reflection?
结合 if constexpr
和一些 <type_traits>
实体,在 C++17 中,我能够在编译时检查类型。这些技术可以被认为是静态反射吗?还是只是型式检查?示例:
if constexpr (std::is_same_v<T, U>) statement
反射概念是否只适用于运行时?叫它静态反射对吗?
我会说是的,反射可以在编译时完成(给出静态反射)的基本思想是完全合理的。事实上,一段时间以来已经有很多关于 C++ 静态反射的论文。举一个明显的例子,考虑 N3996: Static Reflection.
事实上,C++ 委员会有一个正式的研究组 (SG 7),现在涵盖了一般的编译时编程,但最初致力于静态反射。
现在,关于具有某些类型特征的 static if
是否符合静态反射的条件,我会说答案是 "yes",但有一些相当严格的资格,或者至少是限制。例如,具有类型特征的 static if
可能不足以实现上面链接的论文中显示的任何激励示例。
尽管如此,它确实允许一些最小程度的反射,并且它是在编译时完成的,所以它显然是静态反射。
is_same
可以被认为是静态反射的一种形式吗?它实际上是静态的,一种类型的编译时可检测 属性。事实上,您可以编写基于内省此 属性 执行的代码。所以从技术上讲,称它为 "reflection".
是完全有效的
但是如果你想对单词有用,如果你想有效地使用单词进行交流,那么你必须认识到字典定义并不是很有用。这是因为人们有 不同的 词典,对单词含义的期望不同。单词可以改变它们的含义或在不同的上下文中具有特殊含义。因此,如果您要与人有效沟通,您必须使用能够真正传达您想要沟通的意思的词语。
特别是,C++ 上下文中的单词 "static reflection" 通常指的是与 this proposal (PDF) (cleverly named "Static Reflection") and its many, many revisions 相关的功能。具体来说,如果您声称 C++ 具有 "static reflection" 作为某种语言功能,那么对于许多 C++ 用户来说,您就是在声称用户可以执行诸如枚举 class 的属性之类的事情(例如类型的成员子对象)并迭代它们,对每个这样的 属性.
执行一些操作
毕竟,这就是您可以在其他提供反射作为第一个 class 功能的语言中做到的。 "Reflection" 不是 只是 能够询问给定类型是否是特定类型或者给定类型是否满足基本 属性。反思是关于能够反省几乎每个类型感兴趣的方面。
这是"static reflection"这个词给很多C++程序员的期望。当 C++ 程序员谈论想要 "static reflection" 时, 那 就是他们所说的他们想要的。
因此,虽然您可以在技术上声称 C++ 已经具有 "static reflection",但做出这样的声明没有用。
结合 if constexpr
和一些 <type_traits>
实体,在 C++17 中,我能够在编译时检查类型。这些技术可以被认为是静态反射吗?还是只是型式检查?示例:
if constexpr (std::is_same_v<T, U>) statement
反射概念是否只适用于运行时?叫它静态反射对吗?
我会说是的,反射可以在编译时完成(给出静态反射)的基本思想是完全合理的。事实上,一段时间以来已经有很多关于 C++ 静态反射的论文。举一个明显的例子,考虑 N3996: Static Reflection.
事实上,C++ 委员会有一个正式的研究组 (SG 7),现在涵盖了一般的编译时编程,但最初致力于静态反射。
现在,关于具有某些类型特征的 static if
是否符合静态反射的条件,我会说答案是 "yes",但有一些相当严格的资格,或者至少是限制。例如,具有类型特征的 static if
可能不足以实现上面链接的论文中显示的任何激励示例。
尽管如此,它确实允许一些最小程度的反射,并且它是在编译时完成的,所以它显然是静态反射。
is_same
可以被认为是静态反射的一种形式吗?它实际上是静态的,一种类型的编译时可检测 属性。事实上,您可以编写基于内省此 属性 执行的代码。所以从技术上讲,称它为 "reflection".
但是如果你想对单词有用,如果你想有效地使用单词进行交流,那么你必须认识到字典定义并不是很有用。这是因为人们有 不同的 词典,对单词含义的期望不同。单词可以改变它们的含义或在不同的上下文中具有特殊含义。因此,如果您要与人有效沟通,您必须使用能够真正传达您想要沟通的意思的词语。
特别是,C++ 上下文中的单词 "static reflection" 通常指的是与 this proposal (PDF) (cleverly named "Static Reflection") and its many, many revisions 相关的功能。具体来说,如果您声称 C++ 具有 "static reflection" 作为某种语言功能,那么对于许多 C++ 用户来说,您就是在声称用户可以执行诸如枚举 class 的属性之类的事情(例如类型的成员子对象)并迭代它们,对每个这样的 属性.
执行一些操作毕竟,这就是您可以在其他提供反射作为第一个 class 功能的语言中做到的。 "Reflection" 不是 只是 能够询问给定类型是否是特定类型或者给定类型是否满足基本 属性。反思是关于能够反省几乎每个类型感兴趣的方面。
这是"static reflection"这个词给很多C++程序员的期望。当 C++ 程序员谈论想要 "static reflection" 时, 那 就是他们所说的他们想要的。
因此,虽然您可以在技术上声称 C++ 已经具有 "static reflection",但做出这样的声明没有用。