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

时间:2018-08-24 04:53:50

标签: c++ boost-bind

考虑以下代码:

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 个答案:

答案 0 :(得分:4)

此示例对您有用吗?

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

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

  

std :: function的实例可以存储,复制和调用任何Callable   目标...

因此,此类模板(在我们的示例中为void())的模板参数仅仅是 Callable 的签名。在您所有对其调用中返回的bind()完全是void()形式的 Callable

答案 1 :(得分:1)

对于具有相同最终接口(绑定后为final =)的函数,不能保证

this返回相同的类型。因此,不,您将无法在容器中存储与std::bind绑定的函数。您将必须使用某种类型擦除技术将它们全部归为同一类型,例如std::bindstd::function容器将能够存储您的绑定函数(以与类型擦除相关的开销为代价)。

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