您还没有说明在使用错误类型的向量存储func2
后,希望能够做什么。
如果您事先知道参数,可以轻松使用std::bind
将其放入向量中:
const std::vector<std::function<void(std::string)>> functions
{
func1,
std::bind(func2, std::placeholders::_1, 5, 6)
};
现在functions[1]("foo")
将调用func2("foo", 5, 6)
,并且每次都会传递5
和6
给func2
。
这里使用lambda表达式来实现相同的功能,而不是使用std::bind
。
const std::vector<std::function<void(std::string)>> functions
{
func1,
[=](const std::string& s){ func2(s, func2_arg1, func2_arg2); }
};
如果您还不知道参数,可以将引用绑定到某些变量:
int func2_arg1 = 5;
int func2_arg2 = 6;
const std::vector<std::function<void(std::string)>> functions
{
func1,
std::bind(func2, std::placeholders::_1, std::ref(func2_arg1), std::ref(func2_arg2))
};
现在functions[1]("foo")
将调用func2("foo", func2_arg1, func2_arg2)
,您可以为整数赋新值以传递不同的参数到func2
。
使用一个lambda函数来代替std::bind
const std::vector<std::function<void(std::string)>> functions
{
func1,
[&](const std::string& s){ func2(s, func2_arg1, func2_arg2); }
};
虽然这种方式还算简单,但你需要在闭包或绑定表达式引用它们存在的时间内一直保留 int
变量,这看起来很不美观。
for(auto&& function: functions){function();}
等语句,所以你需要保持它们分开,或统一它们的签名(但如果它们确实具有不同的签名,则最后一种选项感觉像是把它们强行放进向量中...) - JBL