0

我正在尝试学习 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 中的可变参数模板,但我并没有真正理解它们。

任何人都可以提供任何见解吗?

4

1 回答 1

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在示例中为两个参数的函数)。

于 2013-10-22T21:01:43.497 回答