网页素材有哪几大类,整站seo排名要多少钱,适合html初学者做的网站,引用评论框代码wordpress抱歉#xff1a;铁汁们#xff0c;最近在做兼职#xff0c;积累社会经验#xff0c;多有拖欠#xff0c;请多多包涵#xff08;抱拳#xff09;
引子#xff1a;接上回我们讲了C11的几种新增#xff0c;今天就来接着讲C11中比较有用的二个东西可变参数模板与包装器。… 抱歉铁汁们最近在做兼职积累社会经验多有拖欠请多多包涵抱拳
引子接上回我们讲了C11的几种新增今天就来接着讲C11中比较有用的二个东西可变参数模板与包装器。 可变参数模板当我们进行cout来打印时或cin来进行输入时我们发现我们打印使用任意数量好任意数量类型的东西你是否会思考为什么呢其实都是可变参数模板的功劳那何为可变参数模板呢
概念
可变参数模板是C11引入的一个特性它允许模板函数或类接受任意数量的模板参数。这种特性极大地增强了模板的灵活性使得我们可以编写能够接受不确定数量参数的泛型代码。在标准库中std::cout 和 std::cin 就是使用了可变参数模板技术的典型例子
可变参数模板的基本语法
templatetypename... Args ReturnType functionName(Args... args) { // 使用args包中的参数 }
这里的 Args... 是一个模板参数包template parameter pack而 args... 是一个函数参数包,它们允许函数或类模板接受任意数量的参数。 如何显示参数包里面的参数呢
一利用递归
//递归终止函数
template class T
void ShowList(const T t)
{cout t endl;
}
// 展开函数
template class T, class ...Args
void ShowList(T value, Args... args)
{cout value ;ShowList(args...);
}二利用逗号表达式
template class T
void PrintArg(T t)
{cout t ;
}
//展开函数
template class ...Args
void ShowList(Args... args)
{int arr[] { (PrintArg(args), 0)... };cout endl;
}
STL容器中的empalce相关接口函数利用了可变参数模板
区别直接构造》》》
但是我们会发现其实差别也不到as:emplace_back是直接构造了push_back // 是先构造再移动构造其实也还好
实例代码
#include vector
#include string
#include mapint main() {// 使用emplace_back在vector中构造一个字符串std::vectorstd::string strings;strings.emplace_back(Hello, World!);// 使用emplace在map中构造一个键值对std::mapint, std::string scores;int studentId 1;scores.emplace(std::piecewise_construct,std::forward_as_tuple(studentId),std::forward_as_tuple(A));return 0;
}
可变参数的引用
一实现print()任意打印其实也可以用输出流来打印自定义类型数据
#include iostream// 可变参数模板函数用于打印任意数量和类型的参数
templatetypename... Args
void print(Args... args) {((std::cout args , ), ...); // 使用C17的折叠表达式std::cout \n; // 换行
}int main() {print(1, Hello, 3.14, a); // 打印整数、字符串、浮点数和字符
}二你可以使用可变参数模板来实现递归模板函数例如计算参数包中所有整数的和
templatetypename T
T sum(T value) {return value;
}templatetypename T, typename... Args
T sum(T first, Args... rest) {return first sum(rest...);
}int main() {auto total sum(1, 2, 3, 4, 5); // 计算12345std::cout Total: total std::endl; // 输出15
}
包装器
在C中包装器可能指的是多种不同的概念但通常它指的是一种设计模式或技术用于提供一个接口或包装以改变或增强现有对象或类型的功能。在C11中包装器可能与智能指针、lambda表达式或函数包装有关
function
在C中function 是标准库中的一个模板类位于 functional 头文件中。std::function 是一个通用的多态函数包装器它可以存储、调用和复制任何可调用对象例如普通函数、Lambda表达式、函数对象以及成员函数指针。
std::function 的主要用途是提供一个可调用的接口该接口可以与任何类型的可调用实体一起工作而不需要关心其具体的类型。这使得 std::function 成为实现回调机制、事件处理等模式的理想选择。
注意点
1function使用为返回类型引用类型引用类型
2function来包装普通成员函数时要用返回要传this*所以我们参数要加一个类*来进行通过
测试代码as:
double e(const inta,const intb)
{return (a b) / 2;
}class b
{
public:double e(const int a, const int b){return (a b) / 3;}
};int main()
{auto vt3 bind(e, 100, placeholders::_1);cout vt3(2) endl;functiondouble(int, int) vt e;cout vt(3,3) endl;functiondouble(b, int, int) vt1 b::e;functiondouble(b*, int, int) vt2 b::e;cout vt1(b(), 3, 3) endl;b h;cout vt2(h, 3, 3) endl;functiondouble(int) vt4 bind(b::e, b(),placeholders::_1,100);cout vt4(2) endl;return 0;
}
bind:
std::bind 是 C 标准库中的一个函数模板位于 functional 头文件中。它用于创建一个新的可调用对象通常是一个函数对象这个新对象将一个或多个参数绑定到一个可调用实体如函数、Lambda 表达式、成员函数等的参数上。std::bind 返回一个 std::function 对象它可以在之后被调用。
底层 注意点
1使用时可以用来绑定调用顺序或者进行绑定参数
2调用bind的一般形式auto newCallable bind(callable,arg_list); 其中newCallable本身是一个可调用对象arg_list是一个逗号分隔的参数列表对应给定的 callable的参数。当我们调用newCallable时newCallable会调用callable,并传给它arg_list中 的参数。 arg_list中的参数可能包含形如_n的名字其中n是一个整数这些参数是“占位符”表示 newCallable的参数它们占据了传递给newCallable的参数的“位置”。数值n表示生成的可调用对 象中参数的位置_1为newCallable的第一个参数_2为第二个参数以此类推
测试代码
double e(const inta,const intb)
{return (a b) / 2;
}class b
{
public:double e(const int a, const int b){return (a b) / 3;}
};int main()
{auto vt3 bind(e, 100, placeholders::_1);cout vt3(2) endl;functiondouble(int, int) vt e;cout vt(3,3) endl;functiondouble(b, int, int) vt1 b::e;functiondouble(b*, int, int) vt2 b::e;cout vt1(b(), 3, 3) endl;b h;cout vt2(h, 3, 3) endl;functiondouble(int) vt4 bind(b::e, b(),placeholders::_1,100);cout vt4(2) endl;return 0;
}
智能指针包装器 C11引入了新的智能指针类型如std::unique_ptr、std::shared_ptr和std::weak_ptr它们可以被视为原始指针的包装器提供了自动内存管理。 有趣的连接可拿来做题 感谢大家支持下次要讲什么我先来个图大家猜猜偷笑