如何将函数作为参数传递

时间:2015-01-07 13:51:54

标签: c++ c++11

赢7 cygwin的 gcc 4.8.3 -std = gnu ++ 11

我已经在stackoverflow和cplusplus上研究了这个,并认为我已经正确地传递了一个函数作为参数,甚至“优雅”,但很明显我误解了一些东西。任何人都可以解释如何正确地传递函数作为参数,以及为什么我的工作不起作用?

为原型提供单个警告,为调用提供单个错误。在注释中将genX更改为genY,但genX和genY都有相同的警告/错误。

class MyClass {
   typedef double (*func_t)(double sum);
   void driver();
   double genX(func_t fnc) { };  
   double genY(double (*funct)(double sum)) { };
   // note: no known conversion for argument 1 from 
   // '<unresolved overloaded function type>' to 
   // MyClass::func_t {aka double (*)(double)}
   double myThingie(double sum) { };
};

void MyClass::driver() {
   genX(myThingie);
   genY(myThingie);
   // no matching function for call to 'MyClass::genX(<unresolved overloaded function type>)'
}

5 个答案:

答案 0 :(得分:4)

  

“任何人都可以解释如何正确地将函数作为参数传递,以及为什么我的工作不起作用?”

你需要

typedef double (MyClass::*func_t)(double sum);
            // ^^^^^^^^

声明成员类函数的函数指针。

获得他们的地址

genX(&MyClass::myThingie);
genY(&MyClass::myThingie);

答案 1 :(得分:1)

您的声明声明函数需要 free 函数指针,而不是成员函数指针。其次,您提供myThingie的函数指针,它是MyClass的成员函数,而不提供实例。阅读C函数指针,或者,如果可以的话,使用std::function来获得更多C ++的解决方案。

答案 2 :(得分:1)

尝试以下

class MyClass {
   typedef double (MyClass::*func_t)(double sum);
   void driver();
   double genX(func_t fnc) { };  
   double genY(double (MyClass::*funct)(double sum)) { };
   // note: no known conversion for argument 1 from 
   // '<unresolved overloaded function type>' to 
   // MyClass::func_t {aka double (*)(double)}
   double myThingie(double sum) { };
};

void MyClass::driver() {
   genX(&MyClass::myThingie);
   genY(&MyClass::myThingie);
   // no matching function for call to 'MyClass::genX(<unresolved overloaded function type>)'
}

答案 3 :(得分:0)

如果您坚持传递(类似C的非成员)函数指针,请使用(特别是为了可读性)typedefclass之外)来声明其签名:

 typedef double func_sig_t(double);

然后传递一个指针,例如

    double genX(func_sig_t* fnc) { };

但是,我会使用std::function

   double genX(std::function<double(double)>);

它不那么便宜,但你可以通过一个lambda闭包,例如调用

   double t;
   double f = genX([=t](double x){return x+t;});

或者您想将指针传递给成员函数?它们有不同的语法!

答案 4 :(得分:0)

myThingie是一个成员函数 - 指向它的指针的类型为double (MyClass::*)(double) A&#34;指向成员的指针&#34;与常规指针完全不同,需要一个可以解除引用的合适类的实例。

您可以将myThingie移出课堂,使其成为&#34;免费&#34;功能,

class MyClass {
   typedef double (*func_t)(double sum);
   void driver();
   double genX(func_t fnc) { };  
   double genY(double (*funct)(double sum)) { };
};

double myThingie(double sum) { };

或调整类型:

class MyClass {
   typedef double (MyClass::*func_t)(double sum);
   double genX(func_t fnc) { };  
   double genY(double (MyClass::*funct)(double sum)) { };
   double myThingie(double sum) { };
};

void MyClass::driver() {
   genX(&MyClass::myThingie);  // The "MyClass::" is important here, too.
   genY(&MyClass::myThingie);
}

在这种情况下,您需要使用&#34;指向成员的指针&#34;取消引用语法来调用该函数 例如,

    double genX(func_t fnc) { return (this->*fnc)(0.0) };