考虑以下代码:
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();
}
答案 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)
this
返回相同的类型。因此,不,您将无法在容器中存储与std::bind
绑定的函数。您将必须使用某种类型擦除技术将它们全部归为同一类型,例如std::bind
。 std::function
容器将能够存储您的绑定函数(以与类型擦除相关的开销为代价)。
我不知道它是否适用于std::function<void()>
,但我怀疑在这方面它与boost::bind
相同。