Могу ли я хранить связанные функции в контейнере?
Рассмотрим следующий код:
void func_0()
{
std::cout << "Zero parameter function" << std::endl;
}
void func_1(int i)
{
std::cout << "One parameter function [" << i << "]" << std::endl;
}
void func_2(int i, std::string s)
{
std::cout << "One parameter function [" << i << ", " << s << "]" << std::endl;
}
int main()
{
auto f0 = boost::bind(func_0);
auto f1 = boost::bind(func_1,10);
auto f2 = boost::bind(func_2,20,"test");
f0();
f1();
f2();
}
Приведенный выше код работает как задумано. Есть ли способ сохранить f0, f1, f2 в контейнере и выполнить его так:
Container cont; // stores all the bound functions.
for(auto func : cont)
{
func();
}
2 ответа
Будет ли этот пример работать на вас?
std::vector<std::function<void()>> container{f0, f1, f2};
for (auto& func : container)
{
func();
}
Вы можете прочитать здесь о std:: function:
Экземпляры std:: function могут хранить, копировать и вызывать любую цель Callable...
Таким образом, аргумент шаблона для этого шаблона класса (void()
в нашем случае) это просто подпись Callable. Какие bind()
возвращается во всех ваших звонках именно на Callable вида void()
,
std::bind
не гарантируется возвращение одного и того же типа для функций с одинаковым конечным интерфейсом (final = после привязки). Так что нет, вы не сможете хранить функции, связанные с std::bind
в контейнере. Вам придется использовать какую-то технику стирания типа, чтобы привести их всех к одному типу, например std::function
, Контейнер std::function<void()>
сможет хранить ваши связанные функции (за счет накладных расходов, связанных с стиранием типов).
Я не знаю, относится ли это к boost::bind
, но я подозреваю, что это так же, как std::bind
в этом отношении.