[指南]:在我们的日常编码中,我们会找到一些功能代码,这些代码将在不同的成员函数中连续使用,但是将这些代码分成成员函数并不容易。解决方案之一是编写一个公共函数,但是该函数使用的某些变量可能会变成全局变量。此外,为了重用这样的一段代码,有必要创建一个单一的函数,该函数不是很容易维护。此时,可以使用函子函数。以下是在文本中引入函子的原因。首先考虑一个简单的示例:假设有一个向量“字符串”,您的任务是计算长度小于5的字符串数,如果您使用count_if函数,则您的代码可能会很长。这样做:boolLengthIsLessThanFive(conststring& ; str){returnstr.length()《 5;} intres = count_if(vec.begin(),vec.end(),LengthIsLessThanFive);其中count_if函数的第三个参数是函数指针,并返回bool类型的A值。通常,如果需要传递特定的阈值长度,则可以这样编写函数:boolLenthIsLessThan(conststring& str,intlen){returnstr.length()" len;}该函数看起来比以前的版本更通用,但是它不能满足count_if函数的参数要求:count_if需要一元函数(只有一个参数)作为其最后一个参数。所以问题是,如何找到上述两个功能的折衷解决方案?此问题实际上可以归因于数据流问题。为了设计这样的函数以使其可以访问该特定长度值,并回顾我们的现有知识,有三种解决方案可供考虑:(1)函数的局部变量:局部变量不能在函数调用中传递,并且调用者无法访问它们。 (2)函数参数:我们已经讨论了此方法,并且多个参数不适用于count_if函数。 (3)全局变量:我们可以将长度阈值设置为全局变量。代码可能看起来像这样:intmaxLength; boolLengthIsLessThan(conststring& str){returnstr.length()《 maxLength;} intres = count_if(vec.begiin(),vec。end(),LengthIsLessThan);该代码看起来非常好,但是不符合规范,更重要的是,它并不优雅。需要考虑以下几个原因:(1)容易出错:为什么要这样说,我们必须先初始化maxLength的值,然后才能继续下一个工作,如果我们忘记了,我们可能无法获得正确的值。回答。另外,变量maxLength和函数LengthIsLessThan之间没有必要的连接,并且编译器无法在调用函数之前确定是否初始化变量,这给程序员带来了负担。 (2)无可伸缩性:如果每次遇到类似的问题时都创建一个新的全局变量,尤其是当多个人合作编写代码时,很容易造成名称空间污染的问题;当有多个变量时,我们使用的可能不是我们想要的。 (3)全局变量的问题:每当创建一个新的全局变量时,即使为了方便编码,我们也需要知道我们应该使用尽可能少的全局变量,因为它的成本很高;可能意味着您有一些要解决的优化计划。函子的引入已经说明了很多,否则我们必须回到最初的问题。有什么解决方案?答案当然是该博客的主要主题:函子。我们的初衷是设计一个一元函数,以便它可以执行二元函数。这似乎并不容易,但是函子可以解决此问题。让我们首先看一下函子的流行定义:函子(也称为函数对象)是可以执行函数功能的类。函数的语法与我们普通的函数调用几乎相同,但是作为函数的类,必须重载operator()运算符,例如:classFunc {public:voidoperator()(conststring& str)const {cout 《》 str“”“ Endl;}}; FuncmyFunc; myFunc(” helloworld!“);”“” helloworld!函子实际上是上述解决方案中的第四个解决方案:成员变量。成员函数可以自然地访问成员变量:classStringAppend {public:explicitStringAppend(conststring& str):ss(str){} voidoperator()(conststring& str)const {cout《》 str《》》》《 ss》《 endl;} private:Conststringss;}; StringAppendmyFunc(“ isworld”); myFunc(“ hello”);》》》它可以传递给一定数量的参数,也可以存储或处理我们需要的更多有用信息。让我们回到count_if问题,您认为问题突然变得清楚了吗? classShorterThan {public:explicitShorterThan(intmaxLength):length(maxLength){} booloperat