c++ - 元编程和运行时代码生成

标签 c++ unix c++11 metaprogramming m4

我有一个要求,我需要在运行时生成函数参数。 在编译时,我不知道参数的数量或它们的类型。它必须在运行时从文件中读取,生成代码并动态加载。

我以前用过M4宏生成语言。它以牺牲可读性和可用性为代价提供了出色的性能。

这次我不想走那条路,而是考虑使用 C++11 Variadic 模板。

有更好的选择吗?

最佳答案

Varadic 模板不起作用,因为您需要在编译时了解所有可能的参数类型列表,然后为每个参数类型列表实例化一个模板。

您的问题本质上是类型的运行时序列化和反序列化。 C++ 没有任何“内置”标准方法来执行此操作。

您需要创建一些GenericParameter 类型,然后:

`vector<GenericParameter*> params`

或类似的。然后,对于要编码的每种类型,创建一个 GenericParameter 的派生类以将其装箱。当您序列化一组参数时,您需要为每个派生类创建和存储某种类型 ID,然后序列化该类的数据。同样,在相反的方向上,您读取类型 ID,构造该类型 ID 的适当派生类,然后用该类的数据填充它。

在你有了这个之后,你可以使用 varadic 模板来验证参数 vector 是否匹配编译的函数,并将运行时 vector 绑定(bind)到函数的静态已知签名,以及自动生成适配器它采用通用 vector 并将参数拆箱为 native 类型。反之亦然。

要看的东西称为 protobuf,它在 Google 大量用于此类事情,我听说过关于它的好消息。

关于c++ - 元编程和运行时代码生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16502744/

相关文章:

c++ - 是否可以在 C 或 C++ 中创建另一个函数?

macos - sendto() dgrams 不会阻塞 OSX 上的 ENOBUFS

c++ - 在字 rune 字中使用 unicode 字符

c++ - 为什么for_each通过move返回函数

c++ - 我无法在 Code::Blocks 中调试

c++ - 不使用 WMI 访问主板信息

linux - Unix:过滤和操作 CSV 中的列数据

shell - 如何计算shell脚本中变量的行数

c++ - 重现 C++ 11 随机生成器的相同结果

c++ - Boost.Filesystem 崩溃