
泛型编程
文章平均质量分 65
直接开始C++模板,总会有最开始的阵痛
NickAsuo
我一个烂到不能再烂的程序员,没人再能跟我比烂
展开
-
C++新经典模板与泛型编程:策略类模板
函数模板,该函数模板的第3个类型模板参数要作出改变,当前第3个类型模板参数的默认值是。中的两个类型模板参数搬到类定义上面作为类模板的模板参数就可以了。函数模板的第3个模板参数必须是一个模板模板参数。,该函数模板包含两个类型模板参数。都是普通的类,其中包含的是一个静态成员函数模板。,这是一个类型,但是,修改后的。已经是一个类模板了,所以。在前面的博文中,策略类。MinPolicy类。原创 2023-12-08 11:40:55 · 603 阅读 · 0 评论 -
C++新经典模板与泛型编程:策略技术中的算法策略
如果要计算一个整型数组中元素的最小值,如何实现?第1件想到的事情就是写一个新的策略类,如这里写一个。增加一个新的类型模板参数,这个模板参数的默认值就是这个策略类。运行程序,新增的代码行结果为10,一切正常。这个程序真的很经典,个人觉得,应该属于。MinPolicy类。SumPolicy类。原创 2023-12-08 11:25:51 · 445 阅读 · 0 评论 -
C++新经典模板与泛型编程:将trait类模板用作模板参数
在上面的代码中,引入了第2个类型模板参数U,该模板参数有一个默认值,而且这个默认值可以通过第1个模板参数推断出来(第2个模板参数依赖于第1个模板参数),所以一般不需要指定。但如果有特殊的需求,也是可以指定的,这就增加了。上面这两行代码,在调用funcsum()时,第1个类型模板参数T被推断为char类型,第2个类型模板参数U就变成了SumFixedTraits类型。函数模板用于计算数组元素的和值。也就是说,计算和值的时候,用于保存和值的。的第2个类型模板参数指定为一个完全不同的。中以往的代码行如下。原创 2023-12-08 09:47:50 · 470 阅读 · 0 评论 -
C++新经典模板与泛型编程:用成员函数重载实现is_base_of
标准中用于判断某个类是否是另一个类父类的类模板。标准中又引入了变量模板简化。未完待续,干他菊花就对了。原创 2023-12-07 22:43:40 · 709 阅读 · 0 评论 -
C++新经典模板与泛型编程:用成员函数重载实现std::is_class
标准中用于判断某个类型是否为一个类类型(但不是联合类型)的类模板。当时在讲解的时候并没有涉及。的实现代码,在这里实现一下。简单地书写一个IsClass类模板实现即可,代码如下。布尔值true(1)原创 2023-12-07 22:06:00 · 486 阅读 · 0 评论 -
C++新经典模板与泛型编程:用成员函数重载实现std::is_convertible
C++标准库中提供的可变参类模板std::is_convertible,这个类模板的主要能力是判断能否从某个类型隐式地转换到另一个类型,返回的是一个布尔值true或false。例如,一般的从int转换成float或从float转换成int,都是可以的。又如,有一个类A和一个类B,代码如下。从结果中可以看到,从类A转换到类B是不允许的(结果为0),其他几个转换都是可以的(结果为1)。因为类B的父类是类A,所以从类B转换到类A是可以的,但从类A转换到类B是不行的。原创 2023-12-07 21:46:48 · 1091 阅读 · 0 评论 -
C++新经典模板与泛型编程:SFINAE特性的信息萃取
这个类模板的主要功能是判断一个类的对象是否能被默认构造(所谓默认构造,就是构造一个类对象时,不需要给该类的构造函数传递任何参数)。同样的功能,借此看一看如何使用SFINAE特性萃取一些重要信息(这里要萃取的信息是判断某个类是否“没有构造函数或有一个不带参数的构造函数”,满足这个条件的类就能够默认构造)。从结果中可以看到,int、double等基本类型(内部类型)对象以及类A对象都是可以默认构造的(结果为1),而类B对象因为其构造函数带一个形参(该形参没有默认值),所以无法默认构造。如果让你来实现一个与。原创 2023-12-07 18:02:36 · 1042 阅读 · 1 评论 -
模板错误:主模板的声明中不允许使用模板参数列表
没有主模板,所以编译报错#include "killCmake.h"#include<string>using namespace std;template<typename T>class Point<char*, T> // 编译,报错error:主模板的声明中不允许使用模板参数列表{public: Point(char* x, T y) : x_(x), y_(y) { }public: char* getX() const { r原创 2023-12-07 17:26:11 · 2038 阅读 · 1 评论 -
C++新经典模板与泛型编程:SFINAE替换失败并不是一个错误
总之,编译器最终的目的就是看调用谁合适,是函数还是函数模板。但是,对于函数模板,当用一个具体类型替换模板参数时,可能会产生意想不到的问题,如产生一些毫无意义的甚至是看起来语法上错误的代码,对于这些代码,编译器的处理方法并不一定是报错,有可能是忽略,编译器认为这个函数模板不匹配针对本次的函数调用,就当这个函数模板不存在一样(想象去机场接某个客人,接机者会根据样貌分辨客人,发现样貌不像的,会直接忽略此人),转而去选择其他更匹配的函数或函数模板。这就是所谓的“替换失败并不是一个错误”这个说法的由来。原创 2023-12-07 14:24:09 · 835 阅读 · 0 评论 -
C++新经典模板与泛型编程:萃取类模板的代码实现,1. std::is_void判断是否为void类型 2. std::is_same判断两个类型是否相同
C++标准库中有一个类模板is_void,用来判断某个类型是不是void类型。那么,这个is_void是怎么实现的呢?其实,is_void就可以看作一个值萃取类模板,这里笔者也写一个值萃取类模板实现is_void类似的功能。请不要忘记,值萃取类模板的功能是“原创 2023-12-07 14:03:08 · 471 阅读 · 0 评论 -
C++新经典模板与泛型编程:萃取技术中的值萃取
除了上述两种解决方案,还可以采用在特化的SumFixedTraits类模板中引入静态成员函数(initValue)的方式解决问题,因为这种函数都写在特化的SumFixedTraits类模板定义中,因此都是inline的成员函数。可以看到,通过值萃取类模板的手段,分别解决了数组元素类型为int、char、double时的求和问题。在上面的代码中,initValue的值是在编译期间就确定好的,可以直接在funcsum()函数模板中使用。,看上面的报错提示,只有整型才能进行这样的初始化,浮点型不可以。原创 2023-12-07 13:21:16 · 906 阅读 · 0 评论 -
C++新经典模板与泛型编程:元编程,这是一个神秘而且牛逼的技术,c++性能提升有《effective C++》,《more effective C++》等等,但是这个技术才真正属于牛逼plus们的绝技
typelisttupleBoost库MPLGitHubMPL 11元编程库C++ 11BoostMPL。原创 2023-12-06 22:52:24 · 489 阅读 · 0 评论 -
c++新经典模板与泛型编程:const修饰符的移除与增加
让你来写移除const修饰符,你会怎么样来写?😂😂trait类模板,如下。原创 2023-12-06 22:34:54 · 1300 阅读 · 0 评论 -
c++新经典模板与泛型编程:引用类型的移除与增加
c++11标准库中提供了一个decltypedecltypedecltypedecltypeC++所以,前面代码中main()函数里,就可以写的更简便了,可以省略::type了也是一个trait类模板,想一想,如果要你自己实现一个类似功能,应该怎么写?原创 2023-12-06 18:02:25 · 642 阅读 · 0 评论 -
c++新经典模板与泛型编程:标准库容器中元素类型的萃取
所以,其实是可以直接获取。原创 2023-12-06 16:54:15 · 417 阅读 · 0 评论 -
c++新经典模板与泛型编程:萃取标准库中std::list和std::vector的迭代器种类出来玩儿,大家猜一猜std::vector的迭代器种类是啥?输入?还是输出?还是前向?还是双向?还是随机
输出型迭代器(output iterator)struct output_iterator_tag。类模板,便可以分析一下,main()主函数中,以下代码是如何执行的。双向迭代器(bidirectional iterator)(C++标准库中定义的类,标识迭代器的种类)起了一个别名。输入型迭代器(input iterator)(1). 在容器中标示出所属迭代器的种类。容器中也是标示出了其对应的迭代器种类。固定萃取类模板的实现代码,其实不复杂。上述代码中,最重要的就是第一个。的迭代器种类给萃取了出来玩。原创 2023-12-06 16:05:38 · 1157 阅读 · 0 评论 -
C++新经典模板与泛型编程:萃取技术与策略技术,那个在C++标准库中无孔不入,无处不在的typename、using等关键字
(1). 当传入一个int类型(int类型数组myintarray1和myintarray2元素的类型),固定萃取类模板可以返回一个__int64类型(数组元素的和值类型)用来保存数组元素和值。(3). 固定萃取类模板的“传入一种类型,萃取出(得到)另外一种类型”。这样,也就不需要在funcsum()函数模板中引入类型模板参数U了。(2). 当传入一个char类型(char类型数组mychararray元素的类型),固定萃取类模板可以返回一个int类型(数组元素的和值类型)用来保存数组元素和值。原创 2023-12-06 10:41:37 · 1227 阅读 · 0 评论 -
泛型编程:进阶的正确打开方式
微信阅读 微信阅读 微信阅读 微信阅读。原创 2023-11-21 14:39:05 · 74 阅读 · 0 评论