我发现自己处于需要将函数作为参数传递给另一个函数的情况。
int callSomeFunction(int &func){
func();
}
如果有任何不同,callSomeFunction
是班级成员。
class A{
A(){}
int callSomeFunction(int &func){
func();
}
~A(){}
};
A a();
a.callSomeFunction(func);
理想情况下,callSomeFunction
可以承担任何类型的功能。
template<typename T>
T callSomeFunction(T &func){
func();
}
我已经尝试了很多事情,谷歌搜索了几个小时,所有标准的东西。我找到了这些东西,但发现它们没有结果,最好的方式来实现这一点,或者更恰当地说是最有效的。
我喜欢在适用的地方使用引用而不是指针,主要是因为它们在任何情况下都不是记忆混乱或语法混乱。但是,如果指针更适用或更好的解决方案,我也欢迎这些答案。 谢谢,如果您认为它可以帮助其他人,那么任何有关如何改进问题的帮助或指示也会受到赞赏。
答案 0 :(得分:0)
这是 C ++ - ic方式:(C ++需要&#39; pythonic&#39;)
标准库包括<functional>
,这是一个允许您轻松完成此操作的标题。
首先,必须包含<functional>
,其中包含std::function
,std::placeholders
和std::bind
。
function
具有以下定义:
std::function<returntype(arg1type, argNtype)> f;
不幸的是,你的类或包装器函数不能使用任何类型的函数,你需要知道你打算使用的任何函数的返回类型或参数类型,或者两者都知道。我建议重新定义所需的函数void
返回类型,并在结尾添加一个额外的参数,函数的输出设置,类似于C中strcat
的工作方式,通过设置第一个参数等于自身和第二个论点。
void myFunction(int *arg1, float *arg2, float *returnType)
一个可以在其外部定义并执行它的函数的类可能看起来像这样:
template<typename F>
class FunctionWrapper {
std::function<void(F)> f; //return type(argument type)
public:
FunctionWrapper(std::function<void(F)> _f) {
f = std::bind(_f, std::placeholders::_1); //makes f equal to _f, and does not specify an argument
}
void runFunc(F arg) { //Now send the arguments
f(arg);
}
};
包含bind...
的行是最重要的。 std::bind
将std::function
定义为另一个函数,并且可以std::placeholders::_N
的形式提供参数或占位符。占位符符合它们的名称,它们允许程序员使用未指定类型和位置/值的参数绑定函数。 std::bind
也可用于通过提前将某些参数设置为常量来简化函数,从而使其在将来更容易使用。
即:
std::function<int(int,int,int)> simpleFunction;
simpleFunction = std::bind(rgbToHex(255, 127, std::placeholders::_1);
simpleFunction(153);
现在程序员只需要指定蓝色组件。
我希望这可以帮助任何有这个问题的人!我需要它为我即将到来的游戏编写一个状态机类...请问你可能有任何问题,如果需要,我会澄清我的答案!
答案 1 :(得分:0)
C ++ 11支持函数指针,以便以下内容有效:
int foo()
{
}
int goo()
{
}
int main()
{
int (*pFoo)() = foo; // pFoo points to function foo()
pFoo = goo; // pFoo now points to function goo()
return 0;
}
因此,对于您的情况,您可以传递函数指针(在此示例中为pFoo
)。
代码信用:http://www.learncpp.com/cpp-tutorial/78-function-pointers/