Могу ли я хранить связанные функции в контейнере?

Рассмотрим следующий код:

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 в этом отношении.

Другие вопросы по тегам