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

时间:2012-06-22 18:08:11

标签: c++ boost stl c++11 std-function

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

例如,boost::function包含方法empty()clear(),但std::function没有。

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

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

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

1 个答案:

答案 0 :(得分:23)

  

我为operator()定义的std::function已被用来替换empty()

你的意思是operator!吗?

对于empty,使用该运算符在布尔上下文中测试它:

if (f.empty())

变为:

if (!f)

if (!f.empty())

变为:

if (f)

(这也适用于boost::functionoperator!operator bool。)

clearnullptr分配f.clear(); ,它不会使其无法使用,只是将其设置为默认构造状态:

f = nullptr;

变为

f = {};

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

f = decltype(f){};

这相当于:

{{1}}

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