将boost :: function转换为std :: function

AJG*_*G85 16 c++ boost stl c++11 std-function

我正在更新一些旧代码,以使用C++ 11功能代替boost等价物.然而,并非所有东西都是简单的命名空间替换,如无序容器和智能指针.

例如boost::function有方法empty(),clear()std::function没有.

有一个已operator()定义的std::function,我一直在使用替换empty()引用,但我应该用什么来替换clear()引用?

我已经考虑过使用std::function赋值运算符并指定nullptr清除它,但我担心可能会产生无意识的副作用,不仅清除底层函数,还会使对象无法使用.

显然,更好的解决方案是任何可重用的成员函数对象的默认初始化,这种方式总是有一个有效的回调,可以简单地用用户提供的回调更新,但我只是想直接替换以前的用法而不是代码审查.

Jon*_*ely 23

有一个我已经用来替换的operator()定义std::functionempty()

你的意思是operator!

对于empty使用该运营商在布尔环境测试:

if (f.empty())
Run Code Online (Sandbox Code Playgroud)

变为:

if (!f)
Run Code Online (Sandbox Code Playgroud)

要么

if (!f.empty())
Run Code Online (Sandbox Code Playgroud)

变为:

if (f)
Run Code Online (Sandbox Code Playgroud)

(这也与工作boost::function,其中也有operator!operator bool.)

为了clear分配nullptr它,它不会使它不可用,它只是将它设置为默认构造状态:

f.clear();
Run Code Online (Sandbox Code Playgroud)

f = nullptr;
Run Code Online (Sandbox Code Playgroud)

或者(感谢Paul Groke提出的建议):

f = {};
Run Code Online (Sandbox Code Playgroud)

这相当于:

f = decltype(f){};
Run Code Online (Sandbox Code Playgroud)

但更高效,更容易打字和更容易阅读!

  • `f = {};` 也适用于重置,我发现它非常优雅。但不确定与 `f = nullptr;` 相比是否会产生运行时开销。 (2认同)