将C ++ 11 std :: function传递给带有boost :: function的遗留函数是否安全

时间:2016-03-11 03:26:30

标签: c++ c++11 boost lambda std-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
});

1 个答案:

答案 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不是什么神奇的东西,它只是函数对象的语法糖。