我正在更新一些旧代码,以使用C ++ 11功能代替boost等价物。然而,并非一切都是简单的命名空间替换,如无序容器和智能指针。
例如,boost::function
包含方法empty()
和clear()
,但std::function
没有。
为operator()
定义的std::function
我一直用来替换empty()
引用,但我应该用什么来替换clear()
引用?
我考虑过使用std::function
赋值运算符并指定nullptr
来清除它,但我担心这可能会产生无意识的副作用,不仅清除底层函数,还会使对象无法使用。
显然,更好的解决方案是任何可重用成员函数对象的默认初始化,这样总有一个有效的回调,可以简单地用用户提供的回调更新,但我只是想直接替换以前的用法现在不是代码审查。
答案 0 :(得分:23)
我为
operator()
定义的std::function
已被用来替换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 = {};
或者(感谢Paul Groke提出的建议):
f = decltype(f){};
这相当于:
{{1}}
但效率更高,更容易打字,更容易阅读!