2013-05-11 51 views
0

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

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

这次我不想走这条路,想用C++ 11 Variadic模板。

有没有更好的选择?

+0

模板在编译时被实例化。你可以把'boost :: variant'的参数作为参数。在最坏的情况下(即你要么实现一种编程语言,要么你的设计很糟糕),请看LLVM。 – 2013-05-12 00:31:29

+0

模板在编译时被实例化。我没有看到这可能会如何帮助您解决运行时代码生成问题。 – Borgleader 2013-05-12 00:31:30

+0

我正在考虑在主程序运行时将其编译并生成一个.so文件,并将其与正在运行的程序进行链接。 – Phelodas 2013-05-12 00:59:41

回答

1

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

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

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

`vector<GenericParameter*> params` 

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

这样做后,您可能可以使用可变模板验证params矢量匹配编译的函数,并将运行时向量绑定到静态已知的函数签名,并自动生成该适配器采用通用向量并将参数拆箱为本机类型。同样在另一个方向。

有些东西看起来叫做protobuf,它在Google这类事情上大量使用,而且我听到过很多关于它的好消息。