C++ 2a

functor相等性判断

2022-07-13  本文已影响0人  左图右码

侯杰将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;
    }
};
上一篇 下一篇

猜你喜欢

热点阅读