![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++模板笔记
文章平均质量分 77
王健
无言
展开
-
按值传递还是按引用传递
从 C++11 开始,可以让调用者自行决定向函数模板传递参数的方式。执行过程中,会发现sum并没有按引用传递,而是按值传递。很明显,这不符合预期。原创 2024-05-10 14:23:41 · 425 阅读 · 0 评论 -
std::invoke解析
std::invoke是c++17标准库引入的一个函数模板。这个函数模板能做什么?原理是什么?先来看一个简单的例子,回答std::invoke“能做什么”。通过上面的例子,可以看出,std::invoke仅仅是对函数指针的调用做了一下封装,这种技术被称作。单从上面的例子来看,std::invoke的存在没有任何意义:直接调用函数更加方便,效率也更高,而通过std::invoke调用并不能带来任何收益。在这个例子中,std::invoke似乎不可取代。原创 2024-05-07 14:54:09 · 865 阅读 · 0 评论 -
移动语义和enable_if<>
c++11引入了一个新的模板函数——std::forward,用于实现完美转发,即强制参数以右值形式转发。为什么要引入这样一个模板?当执行g(X())和g(std::move(x))时,g(X &&x)理想地情况下是调用f(X &&x),但实际上却调用了f(X &x)。之所以会这样,是因为C++编译过程中发生了(关于这一概念,可以参考通过使用std::forward,可以消除std::forward的实现。原创 2024-04-19 18:32:38 · 473 阅读 · 0 评论 -
C++模板基础技巧
当提到typename关键字时,首先想到的便是和class关键字一样,定义模板时引入一个模板参数,但除此之外,typename关键字还拥有另外一个功能——消除歧义:指明模板内部的一个标识符代表的一种类型,而不是一个静态成员,例如:typename T::SubType * ptr表示定义一个类型为T::SubType的指针变量,而不是T类型的静态成员变量和ptr相乘。错误的意思是“为什么必需要使用typename关键字?这与模板的编译机制有关。原创 2024-03-30 18:26:46 · 456 阅读 · 0 评论 -
C++变参模板
从c++11开始,模板可以接受一组数量可变的参数,这种技术称为变参模板。原创 2024-03-10 18:12:43 · 880 阅读 · 0 评论 -
非类型模板参数
通常它们只能是整形常量(包含枚举),指向 objects/functions/members 的指针,objects 或者 functions 的左值引用,或者是 std::nullptr_t (类型是 nullptr)。但是个人始终觉得这个说法有些勉强,非模板类型参数的类型设置为uint64_t,无论10,还是1000,都是用uint64_t,会有什么问题么?非类型模板参数在c++中的使用场景还是比较多的,例如:std::array,std::get(读取std::tuple)。原创 2024-03-05 14:20:43 · 182 阅读 · 0 评论 -
C++类模板
同C++普通类意向,类模板的成员函数的实现即可以放到类的内部,也可以放到类的外部。这里需要注意两个细节,每个成员函数的实现都必须使用‘template ’来表示这是一个模板,并且::(域操作符)之前使用Array取代Array,来限制使用的类型。如果仔细观察,成员函数的赋值函数的返回值类型必须使用Array,而形参的类型却可以直接使用Array。因为在模板类的内部(包括类的定义,成员函数形参,成员函数体)使用Array等同于Array。原创 2024-03-02 17:21:41 · 705 阅读 · 0 评论 -
初识C++模板
尽管源码中仅有一个函数,但却实现了对多种类型的支持。再做一个实验,使用“g++ -S template.cpp -o template.s”生成汇编代码,仔细研究template.s(代码太长,此处不在粘贴),发现可执行程序名称包含max_函数,就是源码中的max_函数。方案二和方案三的本质是一样的,对原有数据类型进行封装,通过回调方式解决数据类型差异问题。从上面的实验推出,名称中包含max_的函数的生成,仅与实例的类型相关,与调用次数无关。实现一个算法:返回两个变量中的较大的一个,并支持不同的数据类型。原创 2024-01-18 20:11:58 · 1072 阅读 · 0 评论 -
C++函数模板
模板在编译过程中,会进行类型推断,平时使用到隐式类型转换(自动类型转换),在类型推断时,几乎全部失效。通过上面的代码可以看出,模板使用非const引用传参是对变量类型要求最严格的,不允许任何隐式类型转换;模板使用const引用传参允许const类型和非const类型转换;模板使用值传参支持数组到同类型指针的转换,也支持const类型和非const类型的转换。原创 2024-01-30 20:05:00 · 623 阅读 · 0 评论