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

谷歌 网站开发/百度云资源搜索

谷歌 网站开发,百度云资源搜索,品牌营销策划方案怎么做,网站开发用啥语言关于 std::reference_wrapper 和 std::function 的详细介绍及具体测试用例: 1. std::reference_wrapper(引用包装器) 核心功能 包装引用:将引用转换为可拷贝、可赋值的对象支持隐式转换:可自动转换为原始引用类型容器…

关于 std::reference_wrapperstd::function 的详细介绍及具体测试用例:


1. std::reference_wrapper(引用包装器)

核心功能
  • 包装引用:将引用转换为可拷贝、可赋值的对象
  • 支持隐式转换:可自动转换为原始引用类型
  • 容器友好:允许在 STL 容器中存储引用(原生 C++ 数组引用无法直接存入容器)
典型应用场景
  • 在容器中存储大型对象的引用(避免拷贝)
  • 需要传递引用的模板元编程场景
  • 配合算法使用引用语义(如 std::for_each 修改原集合)
测试用例
#include <functional>
#include <vector>
#include <algorithm>
#include <iostream>void modify(int& x) {x *= 2;
}int main() {// 场景1:容器存储引用int a = 10, b = 20, c = 30;std::vector<std::reference_wrapper<int>> nums = {a, b, c};// 通过引用修改原始值for (auto& ref : nums) ref.get() += 5;std::cout << "修改后: " << a << ", " << b << ", " << c << "\n";// 输出: 修改后: 15, 25, 35// 场景2:配合算法使用std::for_each(nums.begin(), nums.end(), modify);std::cout << "算法处理: " << a << ", " << b << ", " << c << "\n";// 输出: 算法处理: 30, 50, 70// 场景3:隐式转换int& original_ref = nums[0]; // 自动转换为 int&original_ref = 100;std::cout << "隐式转换后: " << a << "\n"; // 输出: 100return 0;
}

2. std::function(通用函数包装器)

核心功能
  • 类型擦除:统一存储各种可调用对象(函数指针、lambda、成员函数等)
  • 延迟执行:将函数作为参数传递或返回值
  • 运行时多态:动态绑定不同函数实现
典型应用场景
  • 回调函数机制(如事件处理)
  • 命令模式实现
  • 动态策略模式
测试用例
#include <functional>
#include <iostream>
#include <string>// 普通函数
void greet(const std::string& name) {std::cout << "Hello, " << name << "!\n";
}// 函数对象
struct Farewell {void operator()(const std::string& name) const {std::cout << "Goodbye, " << name << "!\n";}
};class Person {
public:void setName(const std::string& name) {m_name = name;}void showName() const {std::cout << "My name is " << m_name << "\n";}
private:std::string m_name;
};int main() {// 包装普通函数std::function<void(const std::string&)> func1 = greet;func1("Alice"); // 输出: Hello, Alice!// 包装函数对象Farewell farewell;std::function<void(const std::string&)> func2 = farewell;func2("Bob"); // 输出: Goodbye, Bob!// 包装 lambdaauto lambda = [](const std::string& s) { std::cout << "Lambda: " << s << "\n"; };std::function<void(const std::string&)> func3 = lambda;func3("Charlie"); // 输出: Lambda: Charlie// 包装成员函数Person person;person.setName("David");// 绑定成员函数(需要对象实例)std::function<void()> func4 = std::bind(&Person::showName, &person);func4(); // 输出: My name is David// 包装带参数的成员函数std::function<void(const std::string&)> func5 = std::bind(&Person::setName, &person, std::placeholders::_1);func5("Eve");person.showName(); // 输出: My name is Eve// 空函数检查std::function<void()> empty_func;if (!empty_func) {std::cout << "空函数对象\n"; // 会执行}return 0;
}

3. 关键对比总结

特性std::reference_wrapperstd::function
主要用途包装引用,实现引用语义的容器存储统一管理各种可调用对象
类型安全性强类型(模板参数指定类型)通过函数签名约束(如 void(int)
性能影响零开销(编译时解析)有运行时开销(类型擦除)
典型操作get(), 隐式转换operator(), bool 转换检查

4. 使用注意事项

(1) reference_wrapper
  • 不能包装临时对象(悬挂引用风险)

  • 不能替代智能指针(不管理生命周期)

  • auto 配合时需注意类型推导:

    auto ref = std::ref(a); // 类型是 reference_wrapper<int>
    int& r = ref;           // 需要显式转换或使用 get()
    
(2) std::function
  • 空状态检查:调用空 function 会抛出 std::bad_function_call

  • 性能关键场景慎用(相比虚函数有额外开销)

  • 存储成员函数时需绑定对象实例:

    // 正确做法
    std::function<void()> f = std::bind(&Class::method, &obj);
    

5. 进阶用法示例

事件系统(std::function 应用)
#include <functional>
#include <vector>class Button {
public:using Callback = std::function<void()>;void addClickListener(Callback cb) {listeners.push_back(cb);}void click() {for (auto& cb : listeners) {if (cb) cb();}}private:std::vector<Callback> listeners;
};// 使用示例
void playSound() { /* ... */ }int main() {Button btn;btn.addClickListener([] { std::cout << "点击事件1\n"; });btn.addClickListener(playSound);btn.click(); // 触发所有回调return 0;
}

总结

  • reference_wrapper
    当需要容器存储引用或模板需要推导引用类型时使用,避免不必要的拷贝。
  • std::function
    当需要统一处理不同类型的回调函数或实现运行时多态时使用,为现代 C++ 回调系统的核心组件。

两者结合使用可以构建灵活高效的抽象机制,例如在事件系统中用 reference_wrapper 传递对象引用,用 std::function 管理事件处理方法。

http://www.whsansanxincailiao.cn/news/31953000.html

相关文章:

  • 114啦建站程序/免费推广网站大全集合
  • WordPress建站 seo/大数据营销推广精准粉
  • 网站建设和建议/网站建设平台有哪些
  • 网站图片翻页怎么做/网站设计制作的服务怎么样
  • 广东东莞疫情最新情况 最新消息/seo黑帽技术有哪些
  • 外贸网站推广方法/北京seo优化排名
  • 做环卫车怎么做网站/佛山做网站建设
  • 手机访问网站页面丢失/网站推广与优化方案
  • 中国林业建设工程网站/宁波seo关键词优化教程
  • 网站仿站建设/seo官网优化怎么做
  • 做网站一定需要服务器吗/seo站长工具下载
  • 网站 建设需求/中国关键词网站
  • 院校建设网站群的原因/新站seo快速排名 排名
  • 网站建设 qq业务网制作/网页设计基础
  • 帮人家做网站难吗/seo在线短视频发布页
  • wordpress xampp建站/推广哪个app最挣钱
  • wordpress更换回编辑器/上海网站seo策划
  • 百度怎么验证网站/宁波seo哪家好快速推广
  • wordpress建立好的网站/搜狗搜索推广
  • 怎样建立一个网站步骤/销售方案怎么做
  • 无锡企业网站/百度网址大全怎么设为主页
  • 2019做网站的出路/营销型企业网站
  • 商城app定制开发/专业seo培训
  • 武汉手机网站建设动态/网站搜索优化公司
  • 招聘网站哪个靠谱/常州百度推广代理公司
  • 网站如何做响应式布局/seo搜索引擎优化排名哪家更专业
  • 长沙做网站改版费用/百度人工客服电话怎么转人工
  • css用代码做网站/网站优化价格
  • 文化旅游做的好的网站/chatgpt网站
  • 那些彩票广告网站怎么做的/公司的网站