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

时间:2013-10-23 23:00:23

标签: c++

为什么这样的功能

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

3 个答案:

答案 0 :(得分:3)

“没有已知的转换”

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

“到”

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

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

答案 1 :(得分:1)

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 ++语言不是将复杂或复杂的语法用于函数指针,而是提供了另一种选择:函数对象 函数对象是具有class的{​​{1}}或struct 示例:

overloaded operator()

要使用此模式,请声明从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_Parameter派生的函数:

Function_Object_Two_Parameter

答案 2 :(得分:1)

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

以下一行

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

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