动态多态与静态多态

动态多态:允许我们通过单个基类指针或引用处理多个派生类型的对象. 模板元编程中强调静态多态,允许不同类型的对象以同样的方式被操纵,只要它们支持某种共通的语法即可.

动态多态,连同"延迟绑定"或"运行期派发",是面向对象程序的关键特性.静态多态(也称参数化多态),是泛型编程的本质要素.

 

在面向对象的编程文献中将一个带有大量成员的类称作blob.类的成员彼此"耦合",因为它们必须被声明在一起.为了避免耦合并提高模块化程度,应该避免使用这种反模式.替代

方式是采用独立的元函数来定义单独的traits

 

元数据:可以被C++编译期系统操纵的"值"可以被认为是元数据.在模板元编程中,两种最常见的数据是类型和整数(包括bool)常量. C++的编译期部分通常被称为"纯函数式语言"

,因为元数据是可变的并且元函数不可以有任何副作用.

 

多态:由于C++模板并非生来就多态地处理不同种类的元数据,因此MPL遵从使用type wrapper来包装非类型元数据的约定.尤其是,数值型元数据被表示为一个类型,该类型具有一个名为::value的

嵌套数值常量成员

  元函数

  数值型元函数

  无参元函数:一般是作为元函数特化,解决基础数据类型的问题

 

  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);
    }
};