在 C++14 中的某些条件下调用函数时,如何延迟实例化函数中传递的函子参数?

问题描述 投票:0回答:1

假设我有一个抽象一些错误处理逻辑的函数,它有一个函子参数。在它内部,它有条件地调用这个函子。

该函数如下所示:

void HandleError(int err_code, std::function<void()> error_logger) {
  //...
  if (condition) {
    error_logger();
  }
  //...
}

但是现在调用者需要在调用此函数之前构造

error_logger
(考虑 lambda)。这有点不太理想。

如何仅在条件为真时调用它才延迟实例化

error_logger
? 不幸的是,我只能使用C++14。但可以使用boost库。

c++ templates c++14
1个回答
0
投票

你可以从接口中删除std::function,例如你想保证不会有堆内存分配,你可以这样编写代码,直接使用lambdas

template<typename LogFunc>
void HandleError(int err_code, LogFunc &&error_logger) {
//...
  if (condition) {
    error_logger();
  }
//...
}

HandleError( 0x10, [](){ // log } );

然而,在 std::function 构造上节省性能没有多大意义。当避免堆分配时,还有一个优化(例如 gcc)。

© www.soinside.com 2019 - 2024. All rights reserved.