侯杰将cpp中的functor翻译成仿函数,它其实是个class或者struct,通过匿名调用operator()处理目标类型,外表看起来像个function。
std::function的原理类似,可以包装function/lambda,调用operator()的时候会将调用转发到包装的function/lambda。因为std::function是个实现了复制/赋值构造的class,所以可以放到容器里。比如在多重回调的时候,可以通过容器的迭代器进行遍历调用。
注册即是向容器中添加function/lambda,但不能直接添加,用std::function包装后进行添加。但在反注册的时候,有点小问题,通过std::find_if查找的时候,怎么写prediction?
在更高的cpp标准里会有更直接的解决方案,当前的解决方法就是利用std::function::target<>,它是个模版函数,会直接返回内部包装的function/lambda的地址。通过地址进行相等性判断即可。
class Coll : public std::vector<std::function<void()>>
{
using type = void(*);
public:
auto find(const value_type& func) const
{
return std::find_if(std::begin(*this), std::end(*this), [=](value_type const& t)
{
return t.target<type>() == func.target<type>();
});
}
bool exist(const value_type& func) const
{
return find(func) != std::end(*this);
}
Coll& operator += (const value_type& func)
{
if (!exist(func))
{
push_back(func);
}
return *this;
}
Coll& operator -= (const value_type& func)
{
if (exist(func))
{
this->erase(find(func));
}
return *this;
}
Coll& operator << (const value_type& func)
{
return *this += func;
}
};
网友评论