《C++ Primer第五版》学习笔记-插播-模板偏特化、编译期Assertions与Type2Type

16.3 其他模板特性

16.3.1 模板偏特化

模板偏特化:
类模板的部分特化,部分特化后依然是模板
不能偏特化一个函数模板
虽然可以全特化calss template中的成员函数,但是不能偏特化他们。


16.3.2编译期Assertions

编译期最简单的assertions依赖于一个事实:大小为0的array是非法的。但是它给出的提示信息很少。我们可以定义以下方法:
template<bool> struct CompileTimeError;
template<> struct CompileTimeError<true> {};
#define STATIC_CHECK(expr) \
(CompileTimeError<(expr) != 0>())
这种方法依赖于几个事实:
我们对CompileTimeError仅做声明不做定义,然后对其定义一个true的特化版本,这样当出现false时,由于仅有声明而没有定义,那么会在编译阶段报错。

编译器会在错误消息中指出template的名称


16.3.3 Int2Type
以下是Int2Type的模板定义:
Template <int v> struct Int2Type
{
Enum {value=v};
}

Int2Type会根据参数所得的不同数值来产生不同的类型,因为不同的template实例化本身就是“不同的类型”,因此Int2Type<0>不同于Int2Type<1>。


符合以下两个条件可以使用Int2Type:
有必要根据某个编译期常数调用一个或者数个不同的函数
有必要在编译期实施分派
如果打算在执行期做分派,使用if-else或者switch即可,然而if-else要求所有分支都必须能够编译通过。
这个小技巧有效的主要原因是因为编译器并不会去尝试编译未被用到的template函数,只会对它做文法检查。这个技巧有用,是因为template的代码中有很多时候需要使用编译期分派。


16.3.4 Type2Type

我们可以使用Type2Type来模拟出template函数的偏特化。其定义如下:
Template <typename T> struct Type2Type
{
Typedef T OriginalType;
};

它没有任何数值,然而不同的类型却足以区分各个Type2Type实体。可以使用它作为函数的参数,从而使得可以选择合适的重载函数。


《C++ Primer第五版》学习笔记-插播-模板偏特化、编译期Assertions与Type2Type,布布扣,bubuko.com

《C++ Primer第五版》学习笔记-插播-模板偏特化、编译期Assertions与Type2Type

上一篇:java笔记之byte的面试题案例分析


下一篇:《C++ Primer第五版》读书笔记(14)--Templates and Generic Programming