函数指向任何具有任意数量参数的成员函数

时间:2015-12-28 17:35:34

标签: c++ member-function-pointers

由于特定的原因,我想要一个可以指向类的任何成员函数的函数指针,并且可以随时更改。我想到了如下设置:

//#include <iostream>
//#include <functional>
#include <cstdarg>

class someclass{
public:
    someclass(){ func = trial; }
    template<typename T, typename... Args> void setfunc(T t, Args... args){
        func = t(args...);
    }
    void trial(){
        //do some stuff
    }
    void trying(int i){
        //do other stuff
    }
    template <typename T>void (someclass::*func)(Args...);

};

int main(){
    someclass c;
    (c.*(c.func))();
    c.setfunc(someclass::trying, 32);
    (c.*(c.func))();

}

不幸的是,C ++不允许我这样做而是给了我错误:

data member 'func' cannot be a member template

我读到你不能制作成员变量的模板以及我写的时候

void (someclass::*func)();

并加密Args - setfunc()中的部分,它适用于trial(),但不适用于trying()。所以我的问题是:无论如何要解决这个问题,解决它还是我可以尝试的任何其他方式?

暂时我在这里:

#include <iostream>
#include <functional>
class someclass{
public:
   someclass(){
        func = std::bind(&someclass::trial, std::placeholders::_1);
    }
    void setfunc(std::function<void(someclass&)> f){ func = f; }
    void trial(){
        //do some stuff
        //std::cout << "1" << std::endl;
    }
    void trying(int i){
        //do other stuff
        //std::cout << "2" << std::endl;
    }
    std::function<void(someclass&)> func;
};

int main(){
    someclass c;
    #c.func(); //!!!
    c.setfunc(std::bind(&someclass::trying, std::placeholders::_1, 32));
    #c.func(c); //!!!
}

我的IDE用#

标记行

1 个答案:

答案 0 :(得分:1)

您可以使用std::function,例如

class someclass{
public:
    someclass(){ func = &someclass::trial; }
    void setfunc(std::function<void(someclass&)> f){ func = f; }
    void trial(){
        //do some stuff
    }
    void trying(int i){
        //do other stuff
    }
    std::function<void(someclass&)> func;
};

int main(){
    someclass c;
    c.func(c);
    c.setfunc([](someclass& cl){cl.trying(32);});
    c.func(c);
}