我有一个要求,我需要在运行时生成函数参数。 在编译时,我不知道参数的数量或它们的类型。它必须在运行时从文件中读取,生成代码并动态加载。
我以前用过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/