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

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来清除它,但我担心这可

我正在更新我们的一些旧代码,以使用C++11特性来代替boost等价物。然而,并不是所有的东西都像无序容器和智能指针那样是一个简单的名称空间替换

例如,
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
assign
nullptr
,它不会使其不可用,只是将其设置为默认构造状态:

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)
有什么不同呢?你认为这个函数做什么?