C++ 为什么不';许多编译语言都包含编译时反射吗?

C++ 为什么不';许多编译语言都包含编译时反射吗?,c++,reflection,compilation,language-agnostic,language-design,C++,Reflection,Compilation,Language Agnostic,Language Design,我正在研究这个主题,为将来可能的数据序列化计划做准备。我很困惑为什么许多流行语言(主要是C++语言,但也有Rust语言)不认为编译时反射是需要支持的 这在数据序列化中经常出现。给定一个类,能够循环它们的数据成员,获取它们的方法名,检索类名,并将所有这些推送到$data\u FILE\u类型将是不可思议的 我是从科学家的角度问的。我经常处理许多不同的硬件。存储数据很便宜,但实验却不便宜。能够干净地保存结构和类,并为数据格式编写一次序列化程序和反序列化程序,那么不用担心更改类将是令人惊讶的 是编译时

我正在研究这个主题,为将来可能的数据序列化计划做准备。我很困惑为什么许多流行语言(主要是C++语言,但也有Rust语言)不认为编译时反射是需要支持的

这在数据序列化中经常出现。给定一个类,能够循环它们的数据成员,获取它们的方法名,检索类名,并将所有这些推送到$data\u FILE\u类型将是不可思议的

我是从科学家的角度问的。我经常处理许多不同的硬件。存储数据很便宜,但实验却不便宜。能够干净地保存结构和类,并为数据格式编写一次序列化程序和反序列化程序,那么不用担心更改类将是令人惊讶的

是编译时反射好处的一个很好的例子。虽然它使用元编译器程序在第一次通过时读取源代码,但理想情况下它不必这样做。现在是2015年,对于许多人来说,无法为他们选择的数据格式(HDF5、JSON、TXT等)编写一个类似于根的库是令人沮丧的


我所描述的在任何流行的编译语言中都是可能的吗

< P> C,因此C++是建立在“不为你不使用的东西付费”的基本前提下。p> 反思需要大量的簿记。对于一个科学家来说,有用的东西对于一个试图只安装几兆RAM的嵌入式系统的人来说简直是谋杀

这很痛苦,但是反射可以在库中实现。我在自己的代码中使用了这样的东西,但只针对少数需要它的子系统,因为我运行的系统即使是异常和普通的旧RTTI都太昂贵了

至于解决方案:您可以看看QT。它是C++的框架。它提供运行时元数据以及许多其他内容


编辑:纯编译时解决方案:LEX和YACC/FLEX。无论如何,向量都没有错,但没有理由不让解析器像许多java生成器那样抛出序列化函数。

有一个C++工作组用于编译时反射。但是如果你真的想这么做,那么要用元编程,这是多年的事情。如果C++标准委员会的研究小组7(SG7)正在研究这一点。简短的答案是为什么委员会已经(至少主要是)试图规范现有的实践,而且没有足够的现有实践在C++中规范化。如果Haskell可以被认为足够受欢迎,那就产生了JSON(DE)。编译时的序列化程序。请参阅我关于为什么反射是个坏主意的讨论:运行时反射需要大量簿记。编译时反射将只使用编译器已经拥有的信息。是的,我只是专门询问编译时,我知道运行时将产生的开销。实际上,仅仅是一个方法函数指针和数据成员的向量就足够了。标记为答案,尽管我认为正确的答案是这是一个非常困难的主题。lexer是一种方法,ROOT基本上就是这样做的。我会看看LeX,我认为LiBrCon可能是有希望的。它令人震惊的是,有多少人认为Lax和YACC只是对他们所有的程序分析/反射/元编程需求的治愈,只是解决了这个问题的问题有多少,更不用说关注C++的纯粹复杂性。看我的文章