假设我有一个像这样的可变函数:
template <typename... A>
void func(A... args)
{
//Do stuff
}
我还有一个这样的矢量:
enum Type{
DOUBLE,
STRING
};
std::vector<std::pair<std::string, Type>> varg;
所以我想遍历地图的元素并使用指定的类型调用模板化函数,例如:varg = {{"a", Type::STRING}, {"1.2", Type::DOUBLE}};
应致电func("a", 1.2)
有关如何做到这一点的任何提示?
答案 0 :(得分:1)
您正在混合编译时和运行时功能。 (提示:它没有工作)
作为一个思想实验:
假设您有某种std::vector<>
,其中包含一些数据,例如N
条目。请注意,此N
是在运行时已知的先验 !
现在,您想要将这些N
数据段解压缩为可变参数模板,必须完成编译时!模板是编译时功能!
这不起作用。如果使用编译时容器,原则上可以执行类似的操作(请参阅boost::mpl
)。但这些要求,你知道(或可以计算)编译时的一切
您也可以查看boost::fusion
哪种尝试弥补这一差距。虽然你应该总是注意到它不能!模板仍然只是编译时间。
答案 1 :(得分:1)
在最低级别(类C),application binary interface跟随一些calling conventions,特别是参数如何传递给函数,它通常取决于参数的类型(通常,指针)进入一些处理器寄存器,浮点数进入其他类型的寄存器)。
如果你想调用一个未知签名的函数(即你只知道它的签名和实际参数及其编号只在运行时,而不是在编译时)你需要一些特定于ABI的技巧,并且可能是某些机器特定的代码您可以考虑使用提供
的libffi顺便说一下,您可以考虑将您的值打包或装箱在“boost::any或QVariant或您自己的tagged unions”或“{3}}”中的“通用”容器中。 p>适用于各种调用约定的便携式高级编程接口
也许你可能想在你的应用程序中嵌入一些解释器,例如boost::variant或GNU guile。
注意到对于C或C ++,函数和函数指针有一些编译时已知签名,这很重要。使用错误的签名(这是一个签名不是编译器期望的签名的函数)调用的东西是Lua。