c++模板到底是什么?

一、语法设计上
从c++语言的设计和演进得知c++之父设计模板的主要目的就是替代c语言的宏定义,觉得宏过于松散,因此才设计了模板,使之宏能做到的事,模板也能,而且做到的更优雅。
二、标准库的使用上
c++著名的stl库,模板的天堂,疯狂秀技术,各种泛函,各种抽象。
三、模板解决了什么
我认为模板其实从根本上将就是宏替换,高明的宏替换。模板能做的事情,没有模板依旧能做。但是是实现的难度就不是普通人能涉及到的了,模板对我来说就是让想优化重复代码手段,模板的轮子定好,你只需要套用即可。
四、模板的应用
模板作为泛函的发家手段。我始终认为你作为一个程序开发者,要简单入手。就像tdd流程里的红-绿-重构,他不是一开始就设计出来的,他是演进出来的,我今天写了a代码,明天写了b代码, 我发现a代码和b代码有重复,就是类型不一样,那我就把类型抽象,做成模板。对于我,模板绝不是什么武功秘籍,也不是什么炫技手段,我觉得学习模板就是为了去除重复代码,减少维护的数据。
五、模板的技术
学习模板很简单,但是很难用出来,只需要看一边type_traits头文件里模板各种实现逻辑,会用不保证,能看懂70~80的模板代码是肯定的了。
无非就那几点:
语法层面:
一、函数模板、类模板
函数模板:
推到规则
1. 值传递,去除cv限定符
2. 左值/*传递,保留cv限定符,类型左值被擦除
3. 右值传递,保留右值,类型右值被擦除
类模板
没啥想说的就是单纯字符串比较+类型擦除(不贴切应该是类型提 取,类型从模板参数里被提取出来了,因此模板参数类型就不带了)
二、模板解包
函数模板解包:
赋值、逗号表达式、递归
类模板解包
递归、继承
三、模板的匹配失败不算报错
模板匹配会找到最特化的版本进行匹配,因此即便其中一个匹配失败了也不会报错,会继续匹配
四、使用方式
我理解大部分使用方式其实和递归是一样的。
最泛化的版本template<class …> struct test{};
特化自己需要的版本template<> test<size_t>{}
再留个end template<> test{};
五、个人感悟
所谓模板编程,可以理解为脱离c++的另一门语言去学了。如果是大部用的c++属于动态思想语言,模板就真的属于编译期间的语言。
动态期间的if else
编译期间的ebable_if
动态期间的变量 int a
编译期间的变量integral_constant<int,0>
编译期间你能做到什么,你了解的越多,模板用的越熟悉。
1. 像stl里的标签分发利用模板函数重载,层层抽象。为什么要给迭代器打标签(移动方式:随即移动、前后移动、单项移动,输入,输出)。因为编译期间你要知道这些,没有这些你怎么设计对应的算法结构。
2. 像enbale_shared_from_this 为什么要公有继承。因为这里边有个标签,你不共有继承他,它内部不知道你用了我。(CRTP,将派生类的对象送入基类,基类可以完成一些相同的功能,这就是模板的魅力)
3. 像invoke,他把所有可调用对象(仿函数,函数指针,类内函数,类内对象)统一了用法。
4. 像reference_wrapper引用包装器,他统一了引用非引用之间的区别,使得接口完全不需要关注变量,直接值传递即可。
5. 像tuple,他保存了全部的类型在自身每次调用tuple_element_t按照索引(std::get)获取类型,然后直接获取数据(这个真的吊,利用c++父子内存模型,堆积木,子类将父类堆在上放,取到对应的父类,只需要父类的类型强转子类即可。tuple获取数据时间复杂度就是直接访问变量的复杂夫屌不屌。)
其本质都是一样的,先设计,在抽象,你发现c++无时无刻都是抽象,不是有那句名言吗,中间层解决一切问题。如果一层解决不了,那就两层。中间层在模板里用的真的多,只要你能想得到的重复,打个标签,搞个中间层分发一下,这不就是if else吗。但是看了这么多,学了这么多,还是用不出来,只能多看多得多总结。道阻且长啊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值