我可以将绑定函数存储在容器中吗?
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::function
。 std::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()
.
考虑以下代码:
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::function
。 std::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()
.