我正在更新我们的一些旧代码,以使用C++11功能代替boost等效功能。但是,并非所有内容都是简单的命名空间替换,例如无序容器和智能指针。
例如,boost::function
有方法empty()
和clear()
,但std::function
没有。
在用std::function
定义一个operator()
来替换empty()
引用,但是我应该使用什么来替换clear()
引用?
我已经考虑过使用 std::function
赋值运算符并分配nullptr
来清除它,但我担心这可能会产生无意的副作用,不仅清除底层函数,而且使对象无法使用。
显然,更好的解决方案是默认初始化任何可重用的成员函数对象,这样总有一个有效的回调,可以使用用户提供的回调简单地更新,但我的目标只是直接替换以前的用法现在不是代码审查。
有一个为
std::function
定义的operator()
,我一直用它来替换empty()
你是说operator!
吗?
对于empty
使用该运算符在布尔上下文中对其进行测试:
if (f.empty())
成为:
if (!f)
或
if (!f.empty())
成为:
if (f)
(这也适用于boost::function
,也有operator!
和operator bool
。
对于clear
为其分配nullptr
,这不会使其无法使用,它只是将其设置为默认构造状态:
f.clear();
成为
f = nullptr;
或者(感谢保罗·格罗克的建议):
f = {};
这相当于:
f = decltype(f){};
但效率更高,更容易打字和阅读!