gpt4 book ai didi

c++ - 传递函数对象 : Error

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:12:37 25 4
gpt4 key购买 nike

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

#include <iostream>
#include <functional>

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

class MyFct : public std::unary_function<const std::string&, void> {
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&, void>) (const std::string&)'

最佳答案

一个常见的错误。 unary_functionbinary_function 只是两个添加 typedef 的结构

argument_type
result_type

分别

first_argument_type
second_argument_type
result_type

不多了。它们是为了方便函数对象类型的创建者,所以他们不必自己做这些。但它们不表现出多态性。你想要的是函数对象包装器。 boost::function 浮现在脑海中:

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

或者做成模板

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

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

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

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

关于c++ - 传递函数对象 : Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/693910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com