Вы не сказали, что вы ожидаете сделать с 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
.
Вот то же самое с использованием лямбда вместо 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
.
И используя лямбда-функцию вместо std::bind
const std::vector<std::function<void(std::string)>> functions
{
func1,
[&](const std::string& s){ func2(s, func2_arg1, func2_arg2); }
};
Однако это довольно уродливо, так как вам нужно сохранять переменные int
до тех пор, пока существует вызываемый объект (замыкание или выражение привязки), ссылающийся на них.
person
Jonathan Wakely
schedule
02.10.2014
for( auto&& function : functions){ function(); }
, поэтому вам все равно нужно держать их разделенными или унифицировать их подписи (но если у них разные подписи, этот последний вариант выглядит как грубое принуждение их к вектору...) - person JBL   schedule 02.10.2014