【问题标题】:How to pass a variable number of arguments of varying types to functions in a C++11 function map?如何将可变数量的不同类型的参数传递给 C++11 函数映射中的函数?
【发布时间】:2013-10-22 20:42:45
【问题描述】:

我正在尝试学习 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 中的可变参数模板,但我并不是很了解它们。

谁能提供任何见解?

【问题讨论】:

  • 你能举个例子说明你想怎么称呼他们吗?
  • call_function 提示用户输入函数的名称并从那里调用它们。我假设当提示输入函数名称时,我也可以确定要传递哪些参数,但我需要弄清楚如何将不同数量和不同类型的参数传递给映射。除非你的意思是别的?我没有发布我的完整代码,如果不清楚,我可以编辑它。

标签: c++ c++11 vector map variadic


【解决方案1】:

这可以使用可变参数模板完美实现。例如:

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 参数的函数)。

【讨论】:

  • 编译该代码时出现以下错误: testingvar.cpp: In function 'int main()': testingvar.cpp:37:27: error: invalid conversion from 'void (*)( int, int)' 到 'int' [-fpermissive] testingvar.cpp:12:9: 错误:初始化 'void event::add_handler(int) [with ARGS = {int, int}]' 的参数 1 [-fpermissive] testingvar.cpp:38:9: error: 'struct event' has no member named 'raise_event'
猜你喜欢
  • 2023-04-02
  • 2015-09-23
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多