18

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

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

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

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

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

4

1 回答 1

26

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

你的意思是一个operator!

使用empty该运算符在布尔上下文中对其进行测试:

if (f.empty())

变成:

if (!f)

或者

if (!f.empty())

变成:

if (f)

(这也适用于boost::function,它也有operator!operator bool。)

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

f.clear();

变成

f = nullptr;

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

f = {};

这相当于:

f = decltype(f){};

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

于 2012-06-22T18:10:50.223 回答