C++ 将boost::function转换为std::function
我正在更新我们的一些旧代码,以使用C++11特性来代替boost等价物。然而,并不是所有的东西都像无序容器和智能指针那样是一个简单的名称空间替换 例如,C++ 将boost::function转换为std::function,c++,boost,stl,c++11,std-function,C++,Boost,Stl,C++11,Std Function,我正在更新我们的一些旧代码,以使用C++11特性来代替boost等价物。然而,并不是所有的东西都像无序容器和智能指针那样是一个简单的名称空间替换 例如,boost::function有方法empty()和clear(),但std::function没有 有一个为std::function定义的operator(),我一直用它来替换empty()引用,但是我应该用什么来替换clear()引用 我考虑过使用std::functionassignment操作符并赋值nullptr来清除它,但我担心这可
boost::function
有方法empty()
和clear()
,但std::function
没有
有一个为std::function
定义的operator()
,我一直用它来替换empty()
引用,但是我应该用什么来替换clear()
引用
我考虑过使用std::function
assignment操作符并赋值nullptr
来清除它,但我担心这可能会产生意外的副作用,不仅会清除底层函数,还会导致对象不可用
显然,更好的解决方案是对任何可重用的成员函数对象进行默认初始化,这样总是有一个有效的回调,可以简单地用用户提供的回调进行更新,但我现在的目标只是直接替换以前的用法,而不是代码复查
有一个为std::function
定义的operator()
,我一直用它来替换empty()
你是说一个操作员代码>
对于empty
使用该运算符在布尔上下文中对其进行测试:
if (f.empty())
变成:
if (!f)
if (f)
或
变成:
if (!f)
if (f)
(这也适用于boost::function
,它还有操作符!
和操作符bool
)
对于clear
assignnullptr
,它不会使其不可用,只是将其设置为默认构造状态:
f.clear();
变成
f = nullptr;
或者(感谢保罗·格罗克的建议):
这相当于:
f = decltype(f){};
但是更有效,更容易打字,更容易阅读 是的,我就是这个意思。我是这样写的,因为代码中充满了if(!m_func.empty())
检查,我已经将其更改为if(m_func)
…f={}
也可用于重置,我发现它非常优雅。但不确定与f=nullptr相比,它是否会产生运行时开销
@PaulGroke,是的,这很优雅,编译结果与f=nullptr
@JonathanWakely完全相同:看看boost::function::clear()()它不仅可以设置为nullptr,还可以执行get_vtable()->clear()
。那么f=nullptr
真的是等价的吗?@jpo38但是这与std::function::operator=(nullptr\u t)
有什么不同呢?你认为这个函数做什么?