指向具有任意数量参数的任意成员函数的函数指针
function pointer to any member function with any number of arguments
由于特定原因,我想要一个可以指向 class 的任何成员函数并且可以随时更改的函数指针。我想到了如下设置:
//#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)();
并在 setfunc()
中删除 Args
部分,它对 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 用 #
标记行
您可以使用 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);
}
由于特定原因,我想要一个可以指向 class 的任何成员函数并且可以随时更改的函数指针。我想到了如下设置:
//#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)();
并在 setfunc()
中删除 Args
部分,它对 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 用 #
标记行您可以使用 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);
}