作为参数的函数

时间:2014-11-25 01:48:24

标签: c++ templates pointers

我发现自己处于需要将函数作为参数传递给另一个函数的情况。

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();
}

我已经尝试了很多事情,谷歌搜索了几个小时,所有标准的东西。我找到了这些东西,但发现它们没有结果,最好的方式来实现这一点,或者更恰当地说是最有效的。

Resource 1

Resource 2

我喜欢在适用的地方使用引用而不是指针,主要是因为它们在任何情况下都不是记忆混乱或语法混乱。但是,如果指针更适用或更好的解决方案,我也欢迎这些答案。 谢谢,如果您认为它可以帮助其他人,那么任何有关如何改进问题的帮助或指示也会受到赞赏。

2 个答案:

答案 0 :(得分:0)

这是 C ++ - ic方式:(C ++需要&#39; pythonic&#39;)

标准库包括<functional>,这是一个允许您轻松完成此操作的标题。 首先,必须包含<functional>,其中包含std::functionstd::placeholdersstd::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::bindstd::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/