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