使用参数向量在C ++中调用可变参数函数

时间:2016-01-26 09:51:33

标签: c++ c++11 variadic-functions

假设我有一个像这样的可变函数:

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)

有关如何做到这一点的任何提示?

2 个答案:

答案 0 :(得分:1)

您正在混合编译时和运行时功能。 (提示:它没有工作)
作为一个思想实验:

假设您有某种std::vector<>,其中包含一些数据,例如N条目。请注意,此N是在运行时已知的先验 ! 现在,您想要将这些N数据段解压缩为可变参数模板,必须完成编译时!模板是编译时功能!

这不起作用。如果使用编译时容器,原则上可以执行类似的操作(请参阅boost::mpl)。但这些要求,你知道(或可以计算)编译时的一切 您也可以查看boost::fusion哪种尝试弥补这一差距。虽然你应该总是注意​​到它不能!模板仍然只是编译时间。

答案 1 :(得分:1)

在最低级别(类C),application binary interface跟随一些calling conventions,特别是参数如何传递给函数,它通常取决于参数的类型(通常,指针)进入一些处理器寄存器,浮点数进入其他类型的寄存器)。

如果你想调用一个未知签名的函数(即你只知道它的签名和实际参数及其编号只在运行时,而不是在编译时)你需要一些特定于ABI的技巧,并且可能是某些机器特定的代码您可以考虑使用提供

libffi
  

适用于各种调用约定的便携式高级编程接口

顺便说一下,您可以考虑将您的值打包或装箱在“boost::anyQVariant或您自己的tagged unions”或“{3}}”中的“通用”容器中。 p>

也许你可能想在你的应用程序中嵌入一些解​​释器,例如boost::variantGNU guile

注意到对于C或C ++,函数和函数指针有一些编译时已知签名,这很重要。使用错误的签名(这是一个签名不是编译器期望的签名的函数)调用的东西是Lua