【问题标题】:Converting boost::function to std::function将 boost::function 转换为 std::function
【发布时间】:2012-06-25 02:01:55
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    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;
    

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

    f = {};
    

    相当于:

    f = decltype(f){};
    

    但更高效,更容易输入和阅读!

    【讨论】:

    • 是的,我就是这个意思。我是这样写的,因为代码中充斥着if (!m_func.empty()) 检查,我一直在更改为if (m_func) ...
    • f = {}; 也适用于重置,我发现它非常优雅。不确定与f = nullptr;相比是否会产生运行时开销。
    • @PaulGroke,是的,这很优雅,并且编译为与 f = nullptr 完全相同。
    • @JonathanWakely:看看 boost::function::clear() (boost.org/doc/libs/1_68_0/boost/function/function_template.hpp),它不仅仅设置为 nullptr,还可以使用 get_vtable()->clear()。那么f = nullptr 真的等价吗?
    • @jpo38 但这与std::function::operator=(nullptr_t) 有何不同?你认为这个函数有什么作用?
    猜你喜欢
    • 2014-12-11
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多