我可以将绑定函数存储在容器中吗?

Can I store bound functions in a container?

考虑以下代码:

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();
}

std::bind 不保证 return 具有相同最终接口(final = 绑定后)的函数类型相同。所以,不,您将无法在容器中存储与 std::bind 绑定的函数。您将不得不使用某种类型擦除技术将它们全部归为同一类型,例如 std::functionstd::function<void()> 的容器将能够存储您的绑定函数(以类型擦除相关的开销为代价)。

我不知道它是否适用于 boost::bind,但我怀疑它在这方面与 std::bind 相同。

这个例子对你有用吗?

std::vector<std::function<void()>> container{f0, f1, f2};
for (auto& func : container)
{
    func();
}

您可以 read here 关于 std::function:

Instances of std::function can store, copy, and invoke any Callable target ...

所以这个 class 模板的模板参数(在我们的例子中是 void())仅仅是 Callable 的签名。 bind() 在您对它的所有调用中返回的正是 Callable 形式的 void().