Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';";“存储成员函数”;模板中_C++_Templates - Fatal编程技术网

C++ Can';";“存储成员函数”;模板中

C++ Can';";“存储成员函数”;模板中,c++,templates,C++,Templates,我想“在我的类中存储成员函数”,以便以后在某些情况下调用它。但我无法修复用于存储带有参数的成员函数的代码。这是我的密码: class IMemFn { public: IMemFn() {} IMemFn(const IMemFn& other) = delete; IMemFn& operator=(const IMemFn& other) = delete; IMemFn(IMemFn&& other) = delete

我想“在我的类中存储成员函数”,以便以后在某些情况下调用它。但我无法修复用于存储带有参数的成员函数的代码。这是我的密码:

class IMemFn
{
public:
    IMemFn() {}
    IMemFn(const IMemFn& other) = delete;
    IMemFn& operator=(const IMemFn& other) = delete;
    IMemFn(IMemFn&& other) = delete;
    IMemFn& operator=(IMemFn&& other) = delete;
    virtual ~IMemFn() {}

    virtual void func(const std::string& name, const std::string& value) = 0;
};

template<typename ReturnType, class Class>
class MemFn final : public IMemFn
{
public:
    typedef ReturnType(Class::*Method)();

    MemFn(Class* object, Method method) : IMemFn(), m_object(object), m_method(method) {};

    virtual void func(const std::string& name, const std::string& value) override final
    {
        (m_object->*m_method)(name, value);
    };

private:
    Class* m_object;
    Method m_method;
};



class Test
{
public:
    template <class Class, typename Method>
    void addMemFn(Class* obj, Method method) {
        auto memFn = new MemFn<typename std::result_of<decltype(method)(Class)>::type, Class>(std::forward<Class*>(obj), std::forward<Method>(method));
        m_memFns.push_back(memFn);
    }

private:
    std::list<IMemFn*> m_memFns;
};


class SomeClass
{
public:
    void funcAll(const std::string& name, const std::string& value) { std::cout << "SomeClass func"; }
};

class SomeClass2
{
 public:
     void func2(const std::string& name, const std::string& value) { std::cout << "SomeClass2 func"; }
};


int main()
{
    Test test;
    SomeClass someClass;
    SomeClass2 someClass2;

    test.addMemFn(&someClass, &SomeClass ::funcAll);
    test.addMemFn(&someClass2, &SomeClass2::func2);

    return 0;
}
类IMemFn
{
公众:
IMemFn(){}
IMemFn(常量IMemFn和其他)=删除;
IMemFn和运算符=(常量IMemFn和其他)=删除;
IMemFn(IMemFn&&other)=删除;
IMemFn和运算符=(IMemFn和其他)=删除;
虚拟~IMemFn(){}
虚空函数(常量std::string和name,常量std::string和value)=0;
};
模板
类MemFn最终版本:公共IMemFn
{
公众:
typedef ReturnType(类::*方法)();
MemFn(类*对象,方法):IMemFn(),m_对象(对象),m_方法(方法){};
虚拟void func(常量std::string&name,常量std::string&value)覆盖final
{
(m_对象->*m_方法)(名称、值);
};
私人:
类*m_对象;
方法m_法;
};
课堂测试
{
公众:
模板
void addMemFn(类*obj,方法){
auto memFn=新memFn(标准::转发(obj),标准::转发(方法));
m_memFns.向后推(memFn);
}
私人:
std::列出m_memFns;
};
上课
{
公众:

void funcAll(const std::string&name,const std::string&value){std::cout此处需要进行一些更改以使其编译:


  • 首先
    std::result\u of谢谢大家的回答!看来我很累了,因为这些该死的填塞。我用std::functions和std::bind一起使用,现在一切都简单明了。所以,我的最终代码是:

    class Test
    {
    public:
        template <class Class, typename Method>
        void addMemFn(Class* obj, Method method) {
            auto func = std::bind(method, obj, std::placeholders::_1, std::placeholders::_2);
            m_funcs.push_back(func);
        }
    
    private:
        std::list<std::function<void(const std::string&, const std::string&)>> m_funcs;
    };
    
    
    class SomeClass
    {
    public:
        void funcAll(const std::string& name, const std::string& value) { std::cout << "SomeClass func"; }
    };
    
    class SomeClass2
    {
    public:
        void func2(const std::string& name, const std::string& value) { std::cout << "SomeClass2 func"; }
    };
    
    
    int main()
    {
        Test test;
        SomeClass someClass;
        SomeClass2 someClass2;
    
        test.addMemFn(&someClass, &SomeClass::funcAll);
        test.addMemFn(&someClass2, &SomeClass2::func2);
    
        return 0;
    }
    
    类测试
    {
    公众:
    模板
    void addMemFn(类*obj,方法){
    auto func=std::bind(方法、对象、std::占位符::u1、std::占位符::u2);
    m_func.向后推(func);
    }
    私人:
    std::list m_funcs;
    };
    上课
    {
    公众:
    
    void funcAll(const std::string&name,const std::string&value){std::cout您是否试图避免
    std::mem_fn
    ?为什么不使用a?还可以查看
    std::bind
    和lambda函数。查看
    std::function
    的实现以获得灵感。
    std::result\u of
    返回类型(类:*Method)();
    这也是错误的,因为该方法采用了两个类型为
    std::string&
    的参数,因此
    ()
    不表示其参数列表。您可以通过删除
    std::bind
    而使用lambda来进一步改进