将 C++11 std::function 传递给采用 boost::function 的遗留函数是否安全
Is it safe to pass C++11 std::function to a legacy function that takes boost::function
我们有一个集中使用 boost::function 的遗留系统,现在它决定转向更新的现代 C++ 标准。假设我们有一个这样的遗留函数:
void someFunction(boost::function<void(int)>);
直接传入C++11函数安全吗?
//calling site, new C++11 code
std::function<void(int)> func = [](int x){
//some implementation
}
someFunction(func); //will this always work?
boost::function 是否也能优雅地处理标准 C++11 lambda?
// will this also work?
someFunction([](int x)->void{
//some implementation
});
是的,这会起作用。
重要的是你不应该混淆类型安全和兼容性。你没有超过std::function
boost::function
。你告诉编译器 wrap you std::function
into a boost::function
.
这可能效率不高 - 因为每个都会在调用时添加另一层间接。但它会起作用。
lambda 也是如此:lambda 没有什么神奇之处,它只是函数对象的语法糖。
我们有一个集中使用 boost::function 的遗留系统,现在它决定转向更新的现代 C++ 标准。假设我们有一个这样的遗留函数:
void someFunction(boost::function<void(int)>);
直接传入C++11函数安全吗?
//calling site, new C++11 code
std::function<void(int)> func = [](int x){
//some implementation
}
someFunction(func); //will this always work?
boost::function 是否也能优雅地处理标准 C++11 lambda?
// will this also work?
someFunction([](int x)->void{
//some implementation
});
是的,这会起作用。
重要的是你不应该混淆类型安全和兼容性。你没有超过std::function
boost::function
。你告诉编译器 wrap you std::function
into a boost::function
.
这可能效率不高 - 因为每个都会在调用时添加另一层间接。但它会起作用。
lambda 也是如此:lambda 没有什么神奇之处,它只是函数对象的语法糖。