动态多态与静态多态编程
动态多态:容许咱们经过单个基类指针或引用处理多个派生类型的对象. 模板元编程中强调静态多态,容许不一样类型的对象以一样的方式被操纵,只要它们支持某种共通的语法便可.app
动态多态,连同"延迟绑定"或"运行期派发",是面向对象程序的关键特性.静态多态(也称参数化多态),是泛型编程的本质要素.模块化
在面向对象的编程文献中将一个带有大量成员的类称做blob.类的成员彼此"耦合",由于它们必须被声明在一块儿.为了不耦合并提升模块化程度,应该避免使用这种反模式.替代函数
方式是采用独立的元函数来定义单独的traits指针
元数据:能够被C++编译期系统操纵的"值"能够被认为是元数据.在模板元编程中,两种最多见的数据是类型和整数(包括bool)常量. C++的编译期部分一般被称为"纯函数式语言"对象
,由于元数据是可变的而且元函数不能够有任何反作用.blog
多态:因为C++模板并不是生来就多态地处理不一样种类的元数据,所以MPL听从使用type wrapper来包装非类型元数据的约定.尤为是,数值型元数据被表示为一个类型,该类型具备一个名为::value的it
嵌套数值常量成员io
元函数编译
数值型元函数
无参元函数:通常是做为元函数特化,解决基础数据类型的问题
Traits:一种经过类模板特化在小片元数据之间创建关联的技术. Traits惯用法的一个关键特性是它是非侵入性的:咱们能够在不修改被关联项自身的前提下,创建一个新的映射.MPL元函数能够看作
traits的一个特例,它们对于任何输入都只有一个结果值.
变长模板:
通常讲的都是变长类型模板参数,这里是一个变长非类型模板参数的例子,基本办法仍是同样的,就是取出一个,而后不断特化,直到最后剩一个模板参数
#include<cstdio> template<int...A> struct container{ void display(){printf("YIKES\n");} }; template<int B, int ...C> struct container<B, C...>{ void display(){ printf("spec %d\n", B); container<C...> test; test.display(); } }; template<int C> struct container<C>{ void display(){ printf("spec %d\n", C); } };