以 C++11 方式重写 boost 风格的代码 (Boost.Bind, Boost.Function)

Rewrite boost flavored code in C++11 manner (Boost.Bind, Boost.Function)

我有一些遗留代码想用 C++11 风格重写。 有一些boost::function定义如下

// void One::first(int)
boost::function<void()> a1 = boost::bind(&One::first, this, this->a); 

// void Two::second()
boost::function<void()> a2 = boost::bind(&Two::second, this); 

// void Three::third(int, const std::string &)
boost::function<void()> a3 = boost::bind(&Three::third, this, 8, str); 

这些变量在不同的地方传递给函数foo

foo(somearg,  a1);          
foo(anotherarg, a2);
foo(othearg, a3);

其中 foo 定义如下

void foo(const Obj &obj, boost::function<void()> caller) {
  ...
  caller();
  ...
}

用 C++11 风格重写此代码的最佳方法是什么?

首先,只需将 boost 替换为 std,并包含 C++ header <functional> 而不是 Boost header。标准 functionbind 基于 Boost 版本,并且在很大程度上与 Boost 版本兼容。

你可以让它更通用:

template <typename Function>
void foo(const Obj &obj, Function caller) {
    //...
    caller();
    //...
}

并避免 function 包装器的开销(并且,正如评论所指出的,模糊的语义限制):

auto a1 = std::bind(&One::first, this, this->a); 
foo(somearg, a1);

您可能会发现 lambda 语法比调用 bind:

更具可读性
auto a1 = [this]{first(a);};