当前位置: 首页 > wzjs >正文

做网站需要招聘内容范本wordpress get_post_mime_type

做网站需要招聘内容范本,wordpress get_post_mime_type,星力游戏源码,杭州网站建设书生商友C标准库中的 <functional> 库是一个强大的工具集&#xff0c;它提供了用于处理函数对象、函数绑定、函数包装等功能的设施&#xff0c;极大地增强了代码的灵活性和可复用性。 1. 函数对象&#xff08;Functors&#xff09; 函数对象&#xff0c;也被称作仿函数&#xf…

C++标准库中的 <functional> 库是一个强大的工具集,它提供了用于处理函数对象、函数绑定、函数包装等功能的设施,极大地增强了代码的灵活性和可复用性。

1. 函数对象(Functors)

函数对象,也被称作仿函数,是重载了 () 运算符的类的实例。其使用方式与普通函数调用类似,但函数对象可以携带状态,这使得它比普通函数更加灵活。

#include <iostream>// 定义一个函数对象类
class Adder {
public:int operator()(int a, int b) const {return a + b;}
};int main() {Adder adder;int result = adder(3, 4);std::cout << "3 + 4 = " << result << std::endl;return 0;
}
  • 原理:在 Adder 类中,重载了 () 运算符,该运算符接受两个 int 类型的参数并返回它们的和。Adder 类的对象 adder 就可以像函数一样被调用,当调用 adder(3, 4) 时,实际上是调用了 Adder 类的 operator() 方法。
  • 优点:函数对象可以包含成员变量,这些成员变量可以在对象创建时进行初始化,并且在多次调用 operator() 时保持状态,这是普通函数无法做到的。

2. std::function

std::function 是一个通用的多态函数包装器,它可以存储、复制和调用任何可调用对象,包括普通函数、函数指针、成员函数指针、函数对象和 lambda 表达式等。

#include <iostream>
#include <functional>// 普通函数
int add(int a, int b) {return a + b;
}int main() {// 使用 std::function 包装普通函数std::function<int(int, int)> func = add;int result = func(3, 4);std::cout << "3 + 4 = " << result << std::endl;// 包装 lambda 表达式std::function<int(int, int)> lambdaFunc = [](int a, int b) { return a * b; };result = lambdaFunc(3, 4);std::cout << "3 * 4 = " << result << std::endl;return 0;
}
  • 模板参数std::function<int(int, int)> 中的模板参数指定了可调用对象的签名,即接受两个 int 类型的参数并返回一个 int 类型的结果。
  • 包装过程:当将普通函数 add 或 lambda 表达式赋值给 std::function 对象时,std::function 会内部存储该可调用对象,并提供统一的调用接口。当调用 func(3, 4)lambdaFunc(3, 4) 时,std::function 会根据存储的可调用对象进行相应的调用。
  • 用途std::function 常用于实现回调机制,例如在事件处理、多线程编程等场景中,通过 std::function 可以方便地传递和调用不同类型的可调用对象。

3. std::bind

std::bind 用于创建一个新的可调用对象,它将一个可调用对象和其部分或全部参数绑定在一起,允许进行部分参数绑定和参数重排。

#include <iostream>
#include <functional>// 普通函数
int add(int a, int b) {return a + b;
}int main() {// 使用 std::bind 绑定 add 函数的第一个参数为 3auto add3 = std::bind(add, 3, std::placeholders::_1);int result = add3(4);std::cout << "3 + 4 = " << result << std::endl;// 参数重排auto sub = [](int a, int b) { return a - b; };auto reversedSub = std::bind(sub, std::placeholders::_2, std::placeholders::_1);result = reversedSub(3, 4);std::cout << "4 - 3 = " << result << std::endl;return 0;
}
  • 部分参数绑定:在 std::bind(add, 3, std::placeholders::_1) 中,add 是要绑定的可调用对象,3 是第一个参数,std::placeholders::_1 是一个占位符,表示新可调用对象的第一个参数。add3 是一个新的可调用对象,当调用 add3(4) 时,实际上是调用 add(3, 4)
  • 参数重排:在 std::bind(sub, std::placeholders::_2, std::placeholders::_1) 中,通过占位符的顺序交换了 sub 函数的参数顺序。当调用 reversedSub(3, 4) 时,实际上是调用 sub(4, 3)
  • 用途std::bind 可以用于简化函数调用,特别是在需要固定部分参数的情况下,或者在需要对参数顺序进行调整的情况下。

4. std::mem_fn

std::mem_fn 用于创建一个可调用对象,该对象可以调用类的成员函数。它可以处理成员函数指针,使得调用成员函数更加方便。

#include <iostream>
#include <functional>class MyClass {
public:void print() const {std::cout << "Hello, World!" << std::endl;}int add(int a, int b) const {return a + b;}
};int main() {MyClass obj;// 使用 std::mem_fn 包装成员函数auto printFunc = std::mem_fn(&MyClass::print);printFunc(obj);auto addFunc = std::mem_fn(&MyClass::add);int result = addFunc(obj, 3, 4);std::cout << "3 + 4 = " << result << std::endl;return 0;
}
  • 成员函数指针&MyClass::print&MyClass::add 是成员函数指针,它们指向 MyClass 类的 printadd 成员函数。
  • 包装过程std::mem_fn 接受成员函数指针作为参数,返回一个可调用对象。当调用 printFunc(obj) 时,std::mem_fn 会将 obj 作为调用 print 成员函数的对象,从而实现成员函数的调用。同样,addFunc(obj, 3, 4) 会调用 objadd 成员函数,并传递 34 作为参数。
  • 用途std::mem_fn 使得成员函数的调用可以像普通函数调用一样方便,特别是在需要将成员函数作为参数传递给其他函数时非常有用。

5. 预定义的函数对象

<functional> 库提供了一系列预定义的函数对象,用于常见的操作,如算术运算、比较运算等。

算术运算
#include <iostream>
#include <functional>int main() {std::plus<int> add;int result = add(3, 4);std::cout << "3 + 4 = " << result << std::endl;std::minus<int> sub;result = sub(4, 3);std::cout << "4 - 3 = " << result << std::endl;return 0;
}
  • std::plusstd::plus<int> 是一个预定义的函数对象,它重载了 () 运算符,用于执行两个 int 类型数的加法运算。当调用 add(3, 4) 时,实际上是调用了 std::plus<int>operator() 方法,返回 3 + 4 的结果。
  • std::minusstd::minus<int> 用于执行两个 int 类型数的减法运算,其原理与 std::plus 类似。
比较运算
#include <iostream>
#include <functional>int main() {std::greater<int> greater;bool isGreater = greater(4, 3);std::cout << "4 > 3: " << (isGreater ? "true" : "false") << std::endl;std::less<int> less;isGreater = less(4, 3);std::cout << "4 < 3: " << (isGreater ? "true" : "false") << std::endl;return 0;
}
  • std::greaterstd::greater<int> 用于比较两个 int 类型数的大小,返回 true 表示第一个参数大于第二个参数。当调用 greater(4, 3) 时,返回 true
  • std::lessstd::less<int> 用于比较两个 int 类型数的大小,返回 true 表示第一个参数小于第二个参数。当调用 less(4, 3) 时,返回 false

6. std::refstd::cref

std::refstd::cref 用于创建引用包装器,当需要将引用传递给 std::bind 或其他需要按值传递参数的地方时非常有用。

#include <iostream>
#include <functional>void increment(int& num) {++num;
}int main() {int num = 3;auto func = std::bind(increment, std::ref(num));func();std::cout << "num = " << num << std::endl;return 0;
}
  • std::refstd::ref(num) 创建了一个对 num 的引用包装器。在 std::bind(increment, std::ref(num)) 中,由于 increment 函数接受一个引用参数,使用 std::ref 可以确保传递给 increment 的是 num 的引用,而不是 num 的副本。当调用 func() 时,increment 函数会修改 num 的值。
  • std::crefstd::crefstd::ref 类似,但它创建的是一个常量引用包装器,用于传递常量引用。

7. std::hash

std::hash 是一个模板类,用于生成对象的哈希值,常用于实现哈希表等数据结构。

#include <iostream>
#include <functional>int main() {std::hash<int> hasher;int num = 3;std::size_t hashValue = hasher(num);std::cout << "Hash value of " << num << " is " << hashValue << std::endl;return 0;
}
  • 哈希函数std::hash<int> 是一个针对 int 类型的哈希函数模板类,它重载了 () 运算符,接受一个 int 类型的参数并返回一个 std::size_t 类型的哈希值。当调用 hasher(num) 时,会根据 num 的值生成一个对应的哈希值。
  • 用途:在实现哈希表、哈希集合等数据结构时,std::hash 可以方便地为元素生成哈希值,从而实现快速的查找和插入操作。

8. std::not_fn (C++17 起)

std::not_fn 用于创建一个新的可调用对象,该对象返回原可调用对象结果的逻辑非。

#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>bool isEven(int num) {return num % 2 == 0;
}int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};auto isOdd = std::not_fn(isEven);auto oddCount = std::count_if(numbers.begin(), numbers.end(), isOdd);std::cout << "Number of odd numbers: " << oddCount << std::endl;return 0;
}
  • 逻辑非操作std::not_fn(isEven) 创建了一个新的可调用对象 isOdd,当调用 isOdd 时,它会调用 isEven 并返回其结果的逻辑非。在 std::count_if 中使用 isOdd 可以统计 numbers 向量中奇数的个数。
  • 用途std::not_fn 可以方便地反转一个布尔函数的逻辑,避免手动编写反转逻辑的代码。

总结

<functional> 库提供了丰富的工具来处理函数对象和函数调用,通过这些工具可以提高代码的灵活性和可维护性。合理使用这些工具可以让代码更加简洁和高效,特别是在实现回调机制、函数绑定、成员函数调用等场景中发挥重要作用。


文章转载自:

http://b3Tb63dU.mdmxf.cn
http://RmyMZwQh.mdmxf.cn
http://ewv6fj5o.mdmxf.cn
http://mvMHwnqo.mdmxf.cn
http://hhnyRb1r.mdmxf.cn
http://qs8aMFf1.mdmxf.cn
http://wDI1dbML.mdmxf.cn
http://ncT84qyb.mdmxf.cn
http://OPsobQdP.mdmxf.cn
http://JOFsl7nG.mdmxf.cn
http://7oXkcRmX.mdmxf.cn
http://uxA4CyKQ.mdmxf.cn
http://utuAgac2.mdmxf.cn
http://4r64AIuJ.mdmxf.cn
http://h6XbVwmU.mdmxf.cn
http://qO0szmfl.mdmxf.cn
http://vhAjIeyH.mdmxf.cn
http://X2JnBNX4.mdmxf.cn
http://JgjgmK7M.mdmxf.cn
http://foBjdVth.mdmxf.cn
http://t0sU0jOM.mdmxf.cn
http://A3PlMTPy.mdmxf.cn
http://0udN4as5.mdmxf.cn
http://PUWHyQqa.mdmxf.cn
http://v0c0qm3k.mdmxf.cn
http://FVQrNDik.mdmxf.cn
http://oTuR6GTn.mdmxf.cn
http://OIt1acHs.mdmxf.cn
http://kctV7Yb8.mdmxf.cn
http://RuwuJ0RL.mdmxf.cn
http://www.dtcms.com/wzjs/655524.html

相关文章:

  • 苏州网站制作网络建设公司网站死循环
  • 小企业官方网站制作图片生成链接的app
  • 公司后台网站怎么做个人简历模板表格下载
  • 网站编辑如何做八年级信息所用软件做网站
  • 所有网站的分辨率关于做好全国网站建设
  • 怎么防止网站被注册机去哪个网站做试用好
  • 济南企业网站关键词推广服务器安全
  • 平台网站空间乌鲁木做兼职的网站
  • 做色网站网站空间排名
  • 建网站免费程序做设计最好的参考网站
  • 网站的优点缺点商业网站建设咨询
  • 网站建设是不是无形资产网站开发定制合同范本
  • 网站开发项目实战视频wordpress缓存与手机版动态切换
  • 做网站推销话术如何招聘软件网站开发人员
  • 常州网站建设选思创做电商网站用什么软件开发
  • 如何采集网站文章软件开发工具包括
  • 网站建设三层架构实训报告招代理的网站要怎么做
  • 做网站公司无锡门户网站建设基本情况
  • 深圳企业建网站软文推广发稿
  • 品牌建设 网站昆明住房和城乡建设局网站
  • 互联网App网站建设方案wordpress 例子
  • 在郑州网站建设wordpress文章前端按钮
  • 电商网站订货广东广州免费建站
  • 手机如何创建简易网站一流的网站建设
  • 大理中小企业网站建设温州建设工程信息网站
  • 怎么用腾讯云主机建设网站适合夜晚使用的十大app
  • 做橡胶应该看什么网站成功的微网站
  • 为什么要建设图书馆网站机械设备怎样做网络推广
  • 酒店行业网站建设方案福州小程序开发平台
  • 销售网站开发实践报告成都公司网站设计