c++11(二)

可变模板参数

cpp 复制代码
template<class ...ARGS>
void print(ARGS&&... args){
}

会自行生成多个参数的函数,如下面代码中可以自动识别有多少个参数。

cpp 复制代码
#include<iostream>
using namespace std;

template<class ...Args>
void Print(Args&&... args){
	cout<<sizeof...(args)<<endl;
} 
int main(){
	Print();
	Print(1);
	Print(1,"xxx");
	Print(1,"xxx",'?');
}

扩展包

可以打印参数

cpp 复制代码
void ShowList(){
	cout<<endl<<endl<<"fish"<<endl<<endl;
} 
template<class T,class ...Args>
void ShowList(T x,Args&&... args){
	cout<<x<<" ";
	ShowList(args...);
} 

lambda表达式

性质

C++ 中,Lambda 表达式本质上是一种"语法糖"。在编译阶段,编译器会自动生成一个匿名的类(闭包对象/Functor)。捕获列表中的变量会变成该类的私有成员变量(按值捕获即为成员拷贝,按引用捕获即为存储地址),而参数列表和函数体则会被转化为重载的 () 运算符。返回的函数名是UUID,保证每一次生成的函数名不相同。

使用

捕获列表 (参数列表) mutable(可选) 异常说明(可选) -> 返回值类型 { 函数体 }

捕捉的变量不可以修改,但是引用捕捉的对象可以修改

cpp 复制代码
#include <iostream>

int main() {
    int factor = 2; // 外部变量
    
    // 定义一个 Lambda:按值捕获 factor,接收一个 int 参数,返回 int
    auto multiply = [factor](int x) -> int {
        return x * factor;
    };

    std::cout << multiply(5) << std::endl; // 输出: 10
    return 0;
}
  • []:不捕获任何外部变量。
  • [=]:按值(复制一份副本)捕获所有被使用的外部局部变量。
  • [&]:按引用捕获所有被使用的外部局部变量。
  • [a, &b]:混合捕获,按值捕获 a,按引用捕获 b
  • [=, &a]:默认按值捕获所有变量,但 a 特例按引用捕获。
  • [this]:捕获当前对象的 this 指针,以便在 Lambda 中访问类的成员变量和函数。

包装器

1. Function(函数 / 函数包装器)

Function 本身意为"功能"或"数学函数",在编程中指执行特定任务的代码块。而在现代语言特性中,它通常指代通用的多态函数包装器 (如 C++ 的 std::function)。

  • 核心作用:统一类型。它可以存储、复制和调用任何可调用对象(如普通函数、Lambda表达式、仿函数等),将不同类型但签名相同的可调用对象统一成一个类型。
  • 典型应用场景:常用于实现回调函数、策略模式以及事件处理等需要解耦的场景。

2. Bind(参数绑定 / 适配器)

Bind 字面意思是"绑定"。在编程中,它是一个函数适配器 (如 C++ 的 std::bind 或 JavaScript 的 Function.prototype.bind())。

  • 核心作用:预先绑定函数的部分参数或上下文环境,从而生成一个新的、参数更少的可调用对象。
  • 典型应用场景
    • 参数绑定与柯里化:固定某些参数,简化后续调用。
    • 调整参数顺序 :通过占位符(如 _1, _2)改变原函数的参数传入顺序。
    • 绑定成员函数 :将类的成员函数转换为普通的可调用对象(通常需要绑定对象实例或 this 指针)。

使用

cpp 复制代码
// 定义两个普通的计算函数
int Add(int a, int b) { return a + b; }
int Multiply(int a, int b) { return a * b; }

// 使用 bind 提前绑定第一个参数为 5,生成新的可调用对象
auto addFive = std::bind(Add, 5, std::placeholders::_1);
auto mulTen = std::bind(Multiply, 10, std::placeholders::_1);

// 使用 function 统一包装,放入操作表中
std::map<std::string, std::function<int(int)>> operationTable;
operationTable["add_5"] = addFive;
operationTable["mul_10"] = mulTen;

// 实际调用:只需传入剩下的参数即可
std::cout << operationTable["add_5"](3);   // 输出: 8 (即 5 + 3)
std::cout << operationTable["mul_10"](4);  // 输出: 40 (即 10 * 4)
相关推荐
lemon_sjdk10 小时前
ObservableNumberValue接口
java·javafx
wxwx_bscxy32210 小时前
springboot巡更系统10192
java·spring boot·后端·巡更系统
hansang_IR10 小时前
【题解】P9753 [CSP-S 2023] 消消乐
数据结构·c++·算法
竞赛考级题库10 小时前
202606 青少年等级考试C/C++真题一级 建议答题时长:60min
java·c语言·c++
大树9110 小时前
把 Java 项目从手动 SCP 升级到 Gitee Go 自动部署:一份踩坑实录
java·golang·gitee
paopaokaka_luck10 小时前
非遗文物数字化系统(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
前端·javascript·vue.js·人工智能·数据分析·echarts
乘风gg10 小时前
AI Coding 提效 2 倍是真的吗?到底怎么衡量效果
前端·ai编程·claude
用户9210802628610 小时前
从对象到原型链:理解 this、构造函数和 new
前端
linx29510 小时前
阶段五讲义:STL 全貌——扔掉手写循环,学“动词“
c++
猫不易10 小时前
Webpack 与 Vite:从 Loader / Plugin 到 Rolldown 统一引擎
前端·vite