我想从一个表中调用所有类型的函数。 (考虑返回类型都是无效的)
为了说明我在说什么,这里有一些代码显然不起作用。
#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/