代码之家  ›  专栏  ›  技术社区  ›  NeomerArcana

如何在模板类中调用函数对象,其中函数对象使用函数签名中的模板?

  •  0
  • NeomerArcana  · 技术社区  · 6 年前

    我不知道这个问题的标题应该怎么说。。。

    我有这样一门课:

    class HasFuncBase
    {
    public:
        virtual int GetKey() = 0;
    };
    
    template<class... Cs>
    class HasFunc : public HasFuncBase
    {
    public:
        typedef std::function<void(std::vector<Cs>&....)> Func;
    
        HasFunc(Func func)
        :
            m_func(func)
        {}
    
        virtual int GetKey() { return id; }
    
    private:
        Func m_func;
    
        static int id;
    };
    
    template<class... Cs>
    int HasFunc::id = unique_key_generator<Cs...>::GetKey();
    

    我跳过了 unique_key_generator 为简洁起见。

    然后,另一个类保存上面m\u func的“数据”:

    class HasData
    {
    public:
        std::vector<std::vector<char>> data;
        int someId;
    }
    

    数据向量中的每个元素都是HasFunc类的数据字节。

    另一个班级负责管理整个课程:

    class Manager
    {
    public:
        std::vector<HasData> m_hadDatas;
        std::vector<HasFuncBase*> m_hasFuncs;
    };
    

    现在,Manager类需要找到匹配数据的匹配funct并调用它们。真正重要的是它将数据作为引用传递,以便 HasFunc 将对存储在 HasData .

    class Manager
    ...
        void CallFuncs()
        {
            for(HasFuncBase* f : m_hasFuncs)
            {
                for(HasData& d : m_hasDatas)
                {
                    if(d.someId == f->GetKey())
                    {
                        /*
                        I need to convert the vector of data vectors
                        in the HasData into function arguments
                        of the right type for HasFunc
                        */
                    }
                }
            }
        }
    ...
    

    我知道我可以向HasFunc类添加模板函数,如:

    class HasClass
    ...
        template<typename... Ts>
        void Execute(std::vector<Ts>&... dataArrays)
        {
            m_func(dataArrays);
        }
    ...
    

    在我看来这是一种方式,因为 Manager 不知道混凝土的类型 HasFuncBase .

    我想我需要一些模板解包技巧 HasClass 将从 经理 然后将 vector<data> 数组,在解包后,放入上面的 Execute 功能,但我不知道如何。

    0 回复  |  直到 6 年前