我正在尝试学习C ++ 11,并开始编写一个程序,将文本文件读入字符串向量,然后将向量传递给一个函数,该函数将要求用户选择他们希望的函数名称适用于矢量。
我在C ++ 11中有一个像这样的函数映射:
std::map<std::string, void(*)(std::vector<std::string>& v)> funcs
{
{"f1", f2},
{"f2", f2},
};
我用以下函数调用它:
void call_function(std::vector<std::string>& v)
{
std::string func;
std::cout << "Type the name of the function: ";
std::cin >> func;
std::cout << "Running function: " << func << "\n";
funcs[func](v);
}
两个示例函数将是:
void f1(std::vector<std::string>& v)
{
std::cout << "lol1";
}
void f2(std::vector<std::string>& v)
{
std::cout << "lol2";
}
截至目前,我已成功地通过从函数映射中调用它们将字符串向量传递给函数,但是,我希望能够传递不同类型的可变数量的参数。我希望能够做的是将我的函数更改为接受整数和字符串参数,但并非所有函数都接受相同数量的相同类型的参数或参数。
例如,我可能希望允许地图中的一个函数接受一个字符串和一个整数作为参数,而另一个函数可能只接受一个整数或一个字符串作为参数。我怎么能完成这个?到目前为止,我一直无法发现通过map将变量参数传递给我的函数的方法。
std :: map可以吗?我也在研究C ++ 11中的可变参数模板,但我并没有真正理解它们。
任何人都可以提供任何见解吗?
答案 0 :(得分:0)
使用可变参数模板可以完美实现。例如:
template<typename... ARGS>
struct event
{
typedef void(*)(ARGS...) handler_type;
void add_handler(handler_type handler)
{
handlers.push_back(handler);
}
void raise_event(ARGS args...)
{
for(handler_type handler : handlers)
handler(args...);
}
private:
std::vector<handler_type> handlers;
};
void on_foo(int a,int b) { std::cout << "on foo!!! (" << a << "," << b << ")" << std::end; }
int main()
{
event<int,int> foo;
foo.add_handler(on_foo);
foo.raise_event(0,0);
}
此类表示一个事件。事件实际上是指定签名的一组回调(在示例中是两个int
参数的函数)。