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



我正在更新我们的一些旧代码,以使用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){};

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

相关内容

最新更新