c++ - 无论参数签名如何,我都可以制作一个函数表吗?

标签 c++ c++11 lambda

我想从一个表中调用所有类型的函数。 (考虑返回类型都是无效的)

为了说明我在说什么,这里有一些代码显然不起作用。

#include <iostream>
#include <map>
#include <functional>

void foo(int x){std::cout<<x;}
void bar(){std::cout<<"bar";}


std::map<std::string, std::function<void()>> map = 
{
    {"foo", foo},
    {"bar", bar}
};

int main()
{
    map["foo"](2);
    map["bar"]();
}

我不反对 C 风格的解决方案。

最佳答案

您可以将您的指针声明为旧式 C 函数指针 可变参数函数,例如:

 foo(...);
 bar(...);

 std::map<void(*)(...)> map = 
 {
    {"foo", foo},
    {"bar", bar}
 };

但是 foo 和 bar 必须遵循 va_args、va_start 的可变参数调用约定 等等,您只能从列表中拉出 C POD。不知道是否值得麻烦。调用方法仍然必须以某种方式知道要传递的参数数量。

看起来您可能会重新考虑您的设计。

例如,如果这应该是一种 CLI 的命令表,那么传递一个 std::vector<std::string> 可能会更好。到每个潜在的命令,并使其确定 vector 是否具有适合其目的的正确 size()。

关于c++ - 无论参数签名如何,我都可以制作一个函数表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26512904/

相关文章:

c++ - CGAL - 制作时时钟转动?

c++ - 为什么在 C++ 中将较大函数中的某些功能编写为 lambda?

C++如何在使用哈希函数时计算冲突次数?

C++ - 在大文本中搜索重复的字符串

c++ - OpenCV Otsu 的阈值 : Calculate single threshold value for multiple Mat objects

c++ - 如何知道何时通过 C++ 11 上的终端管道输入?

c++ - 如何访问存储在结构中的模板函数?

c# - 使用 select new 语句返回所有记录的 Linq 查询

c++ - lambda 中的 Const 参数

c++ - 用 C++ 制作游戏训练器?