当前位置:  开发笔记 > 编程语言 > 正文

传递函数对象:错误

如何解决《传递函数对象:错误》经验,为你挑选了1个好方法。

传递函数对象的以下小程序有什么问题?

#include 
#include 

void foo(const std::unary_function& fct) {
  const std::string str = "test";
  fct(str); // error
}

class MyFct : public std::unary_function {
public:
  void operator()(const std::string& str) const {
    std::cout << str << std::endl;
  }
};

int main(int argc, char** argv){
  MyFct f;
  foo(f);
  return 0;
}

我在第6行收到以下错误:

 no match for call to 
`(const std::unary_function) (const std::string&)'

Johannes Sch.. 11

一个常见的错误.unary_function并且binary_function只是两个添加typedef的结构

argument_type
result_type

和分别

first_argument_type
second_argument_type
result_type

不多.它们是为了方便函数对象类型的创建者,因此它们不必自己执行.但他们并不表现出多态性.你想要的是功能对象包装器.boost::function浮现在脑海中:

void foo(boost::function const& fct) {
  const std::string str = "test";
  fct(str); // no error anymore
}

或者将其作为模板

template
void foo(FunctionObject const& fct) {
  const std::string str = "test";
  fct(str); // no error anymore
}

您可以按值获取它,然后返回副本,foo如果使用它将其应用于某个序列.这将允许函数对象更新其成员中的某些状态变量.for_each是一个像这样的例子.一般来说,无论如何,我会接受它们的价值因为它们通常很小并且复制它们可以提供更大的灵活性.所以我这样做

template
void foo(FunctionObject fct) {
  const std::string str = "test";
  fct(str); // no error anymore
}

然后,您将能够获取fct的副本并将其保存在某处,并且fctoperator()可以是非const并更新某些成员(这是整个点的一部分operator()).请记住,如果通过const引用获取函数对象,则通常无法复制它,因为用户可能已经传递了一个函数.然后复制它将尝试本地声明一个函数而不是本地函数指针.但是,接受by-value会在函数传递时接受函数指针,这可以安全地复制.



1> Johannes Sch..:

一个常见的错误.unary_function并且binary_function只是两个添加typedef的结构

argument_type
result_type

和分别

first_argument_type
second_argument_type
result_type

不多.它们是为了方便函数对象类型的创建者,因此它们不必自己执行.但他们并不表现出多态性.你想要的是功能对象包装器.boost::function浮现在脑海中:

void foo(boost::function const& fct) {
  const std::string str = "test";
  fct(str); // no error anymore
}

或者将其作为模板

template
void foo(FunctionObject const& fct) {
  const std::string str = "test";
  fct(str); // no error anymore
}

您可以按值获取它,然后返回副本,foo如果使用它将其应用于某个序列.这将允许函数对象更新其成员中的某些状态变量.for_each是一个像这样的例子.一般来说,无论如何,我会接受它们的价值因为它们通常很小并且复制它们可以提供更大的灵活性.所以我这样做

template
void foo(FunctionObject fct) {
  const std::string str = "test";
  fct(str); // no error anymore
}

然后,您将能够获取fct的副本并将其保存在某处,并且fctoperator()可以是非const并更新某些成员(这是整个点的一部分operator()).请记住,如果通过const引用获取函数对象,则通常无法复制它,因为用户可能已经传递了一个函数.然后复制它将尝试本地声明一个函数而不是本地函数指针.但是,接受by-value会在函数传递时接受函数指针,这可以安全地复制.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有