将一个函数作为参数传递给另一个函数

Passing a function as an argument to another function

本文关键字:函数 另一个 参数传递 一个      更新时间:2023-10-16

为什么这样的函数可以

typedef std::vector<someclass> infocontainer;
double function2(const infocontainer&);
void function1(std::ostream&, const std::string&, double function2(const infocontainer&), const infocontainer, const infocontainer);

在主运行中调用时运行正常

function1(std::cout, "astring", function2, did, didnt);

但是当 function2 有第二个参数时,它会产生一个错误。

double function2(const infocontainer&, std::string&);
void function1(std::ostream&, const std::string&, double function2(const infocontainer&, const std::string&), const infocontainer, const infocontainer);

主要

function1(std::cout, "astring", function2, did, didnt);
candidate function not viable: no known conversion from 'double (const infocontainer &, const
  std::string &)' to 'double (*)(const infocontainer &, std::string &)' for 3rd argument

"no known conversion from"

double (const infocontainer &, const  std::string &)

"到"

double (*)(const infocontainer &, std::string &)

区别在于const到第二个参数。您可能认为该函数被定义为double function2(const infocontainer&, const std::string&);但您的编译器不同意。

因为您发布的代码与您尝试编译的代码不同。

下一行

void function1(std::ostream&, const std::string&, double function2(const infocontainer&, const std::string&), const infocontainer, const infocontainer);

在您尝试编译的代码的第三个参数中std::string &之前缺少const

typedef是你的函数指针的朋友。
typedef将减少很多问题,尤其是在为函数指定参数时。

例:

typedef double (*Pointer_To_One_Argument_Function)(const infocontainer&);  
typedef double (*Pointer_To_Two_Argument_Function)(const infocontainer&, std::string&);  
void function1A(std::ostream&, const std::string&, Pointer_To_One_Argument_Function, const infocontainer, const infocontainer);  
void function1B(std::ostream&, const std::string&, Pointer_To_Two_Argument_Function, const infocontainer, const infocontainer);  

在上面的示例中,typedef可以使声明更具可读性。
此外,如果选择更改函数指针的参数数量或类型,则更改参数的类型会更容易。

至于您的问题,请检查双参数函数指针示例中函数指针的语法。

替代:函数对象(函子)

C++语言不是对函数指针使用复杂或复杂的语法,而是提供了另一种选择:函数对象。
函数对象是具有overloaded operator()classstruct
例:

struct Function_Object_One_Parameter
{
   virtual double operator()(const infocontainer&) = 0;
};
struct Function_Object_Two_Parameter
{
   virtual double operator()(const infocontainer&, std::string&) = 0;
};
void function1C(std::ostream&, const std::string&, Function_Object_One_Parameter& f1, const infocontainer ic, const infocontainer)
{
  // ...
  f1(ic);
  // ...
}
void function1D(std::ostream&, const std::string& s, Function_Object_Two_Parameter& f2, const infocontainer ic, const infocontainer)
{
  // ...
  f2(ic, s);
  // ...
}

要使用此模式,请声明派生自Function_Object_One_ParameterFunction_Object_Two_Parameter的函数:

struct Happy_Function_One
: public Function_Object_One_Parameter
{
  double  operator()(const infocontainer&)
  {
    std::cout << "Happy" << std::endl;
    return 3.14159267;
  }
}