假设我有一个抽象一些错误处理逻辑的函数,它有一个函子参数。在它内部,它有条件地调用这个函子。
该函数如下所示:
void HandleError(int err_code, std::function<void()> error_logger) {
//...
if (condition) {
error_logger();
}
//...
}
但是现在调用者需要在调用此函数之前构造
error_logger
(考虑 lambda)。这有点不太理想。
如何仅在条件为真时调用它才延迟实例化
error_logger
?
不幸的是,我只能使用C++14。但可以使用boost库。
你可以从接口中删除std::function,例如你想保证不会有堆内存分配,你可以这样编写代码,直接使用lambdas
template<typename LogFunc>
void HandleError(int err_code, LogFunc &&error_logger) {
//...
if (condition) {
error_logger();
}
//...
}
HandleError( 0x10, [](){ // log } );
然而,在 std::function 构造上节省性能没有多大意义。当避免堆分配时,还有一个优化(例如 gcc)。