以 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。标准 function
和 bind
基于 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);};
我有一些遗留代码想用 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。标准 function
和 bind
基于 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);};