我们有一个遗留系统,它强烈地使用 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
});
答案 0 :(得分:8)
是的,这将有效。
重要的是,您不应将安全类型与兼容性混淆。您不将// Oversimplified repo
class MovieRepository extends EntityRepository
{
public function findAllWithPagionation($resultsPerPage, $activePage)
{
$builder = $this->createQueryBuilder('m');
$totalRows = $builder->getQuery()->getSingleScalarResult();
return array(
'total' => $totalRows,
'results' => $builder
->setFirstResult($resultsPerPage * $activePage)
->setMaxResults($resultsPerPage)
->getQuery()
->getResult()
);
}
}
作为 std::function
传递。您告诉编译器将<{em> boost::function
。
这可能效率不高 - 因为每个都会在调用时添加另一层间接。但它会奏效。
同样的事情对于lambdas来说:lambda不是什么神奇的东西,它只是函数对象的语法糖。