【问题标题】:Meta programming and runtime code generation元编程和运行时代码生成
【发布时间】:2013-05-11 23:36:43
【问题描述】:

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

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

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

还有更好的选择吗?

【问题讨论】:

  • 模板在编译时被实例化。您可以将boost::variants 的向量作为参数。在最坏的情况下(即你要么正在实现一种编程语言,要么你的设计很糟糕),看看 LLVM。
  • 模板在编译时被实例化。我看不出这如何帮助您解决运行时代码生成问题。
  • 我正在考虑在主程序运行时编译和生成一个.so,并将其与正在运行的程序链接。
  • 这个问题对我来说太笼统了。所以你有一些功能和一些数据,你必须将它们配对?所以你有一个 data1,然后你必须调用 fn1(data1.param1, data2.param2...) ...?
  • 只是编译时未知的函数参数还是在运行时读取的文件也包含函数体?

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


【解决方案1】:

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

您的问题本质上是类型的运行时序列化和反序列化。 C++ 没有任何“内置”标准方法来做到这一点。

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

`vector<GenericParameter*> params`

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

完成此操作后,您可以使用可变参数模板来验证参数向量是否与已编译的函数匹配,并将运行时向量绑定到函数的静态已知签名,以及自动生成适配器它采用泛型向量并将参数拆箱为本机类型。另一个方向也一样。

需要查看的东西称为 protobuf,Google 大量使用它来处理这类事情,而且我听说过它的好消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2010-11-23
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多