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

西安做网站哪家便宜建设西安网站

西安做网站哪家便宜,建设西安网站,广东住房城乡建设厅网站首页,网站建设的好处和目的std::function 是 C11 引入的通用可调用对象包装器,用于存储、复制和调用任意符合特定函数签名的可调用对象(如函数、lambda、函数对象等)。以下是其核心要点及使用指南: ​​核心特性​​ ​​类型擦除​​ 可包装任意可调用对…

std::function 是 C++11 引入的通用可调用对象包装器,用于存储、复制和调用任意符合特定函数签名的可调用对象(如函数、lambda、函数对象等)。以下是其核心要点及使用指南:


​核心特性​

  • ​类型擦除​

可包装任意可调用对象,只要其调用签名与模板参数匹配。

例如:std::function<int(int, int)> 可存储普通函数、lambda、std::bind 表达式等,只要它们接受两个 int 参数并返回 int

  • ​灵活性​

比函数指针更通用,支持成员函数、带状态的函数对象等。

#include <functional>
#include <iostream>void print(int x) { std::cout << x << std::endl; }struct Functor {void operator()(int x) const { std::cout << x << std::endl; }
};int main() {std::function<void(int)> f1 = print;          // 普通函数std::function<void(int)> f2 = Functor();       // 函数对象std::function<void(int)> f3 = [](int x) {      // Lambdastd::cout << x << std::endl;};f1(42);  // 输出 42f2(42);  // 输出 42f3(42);  // 输出 42
}
  • ​成员函数绑定​

需结合 std::bind 或 Lambda 绑定对象实例:

class MyClass {
public:void method(int x) { std::cout << x << std::endl; }
};int main() {MyClass obj;// 使用 std::bindstd::function<void(int)> f1 = std::bind(&MyClass::method, &obj, std::placeholders::_1);// 使用 Lambdastd::function<void(int)> f2 = [&obj](int x) { obj.method(x); };f1(42);  // 输出 42f2(42);  // 输出 42
}

​使用注意事项​

  • ​空状态检查​

调用空的 std::function 会抛出 std::bad_function_call

检查是否可调用:

std::function<void(int)> f;
if (f) {  // 检查是否非空f(42);
}
  • ​性能开销​

存在类型擦除带来的间接调用开销(类似虚函数调用),通常适用于非性能敏感场景。

对比模板的高效性:

template <typename Callable>
void call(Callable&& f, int x) { f(x); }  // 无运行时开销,适合高频调用
  • ​类型兼容性​

参数和返回类型支持隐式转换:

void func(double x) { std::cout << x << std::endl; }
std::function<void(int)> f = func;
f(42);  // int 隐式转为 double,输出 42.0
  • ​不可比较性​

std::function 对象无法直接比较是否包装同一可调用对象:

std::function<void()> f1 = [] {};
std::function<void()> f2 = [] {};
// if (f1 == f2) { ... }  // 错误:operator== 未定义

​适用场景​

  • ​回调机制​

事件处理、异步操作等需动态注册回调的场景:

class Button {
public:void setOnClick(std::function<void()> onClick) {onClick_ = std::move(onClick);}void click() { if (onClick_) onClick_(); }
private:std::function<void()> onClick_;
};
  • ​策略模式​

运行时动态切换算法或行为:

class Processor {
public:using Algorithm = std::function<int(int, int)>;void setAlgorithm(Algorithm algo) { algo_ = algo; }int process(int a, int b) { return algo_ ? algo_(a, b) : 0; }
private:Algorithm algo_;
};
  • ​函数组合​

实现高阶函数(如函数适配器):

auto compose(std::function<int(int)> f, std::function<int(int)> g) {return [f, g](int x) { return f(g(x)); };
}

​总结​

  • ​优势​​:类型安全、灵活性高,适合需要动态绑定可调用对象的场景。
  • ​局限​​:运行时开销较高,无法直接比较包装的内容。
  • ​替代方案​​:在性能关键代码中,优先考虑模板或函数指针。
http://www.dtcms.com/a/505849.html

相关文章:

  • 手机参数查询网站手机网页版微信登录入口
  • 温州网站专业制作wordpress炫酷模板下载
  • 网站 数据库 sql 导入数据库文件有没有帮人做简历的网站
  • 服装网站建设规划建站之星 网站排名
  • 上海建筑网站设计网站建设与推广的策划方案
  • 做个网站多少钱如何搭建微信公众号平台
  • 网站建设公司做前端餐饮公司企业网站源码
  • 做网站所用的工具襄阳市做网站 优帮云
  • iapp网站做软件教程临沂seo网站管理
  • 网站推广软件信息百度快照推广效果怎样
  • 网页设计欣赏网站网站后期推广方案
  • 网站开发有哪些工作岗位招聘平台
  • 网站百度收录怎么做广州创建网站
  • 主要的网站开发技术网站负责人照片
  • 百度建立企业网站建设的目的企业为什么要建立自己的网站
  • 网站建设行业标准备案添加网站
  • 搜索敏感词后很多网站打不开了二维码网页制作免费网站制作
  • ip网站查询服务器企业建站 wordpress
  • 网站的运营模式女同性做的视频网站
  • 什么软件可以做动漫视频网站模板网字库
  • 黄骅做网站的电话免费网站推广网站在线
  • 购物网站模板站深圳网页制作与网站建设地址
  • 多个域名 一个网站电脑ps软件哪个好
  • 邢台做网站优化哪儿好三亚网络推广
  • 四平网站建设404页面对网站的好处及设置方法延安网站建设推广
  • 写作网站的文风网站权重降低
  • 上海建科建设监理网站温州百度搜索网站排名
  • 宠物网站建设策划书网站管理平台模板
  • 公司网站上传图库东莞优化网站建设
  • 衡阳网站备案wordpress 单本小说