美文网首页C++ 2a
functor相等性判断

functor相等性判断

作者: 左图右码 | 来源:发表于2022-07-13 11:50 被阅读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;
        }
    };
    

    相关文章

      网友评论

        本文标题:functor相等性判断

        本文链接:https://www.haomeiwen.com/subject/quipvrtx.html