策略类
两种实现方式
- 普通类+ 成员函数模板
- 类模板
宿主类与策略类依赖方式
- 策略类作为宿主类的模板参数
- 作为宿主类的模板模板参数
template <template <class> class Policy>
class 宿主类
析构函数
当宿主类与策略类是派生关系时,不要使用虚析构函数。替代方式
- protected或者private继承
- 非虚protected析构函数(建议)
为什么不要定义虚析构函数?
- 策略类一般没有数据成员,只有方法规范行为
- 妨碍静态连结特性,虚函数添加后添加了虚函数表,对象大小带来额外开销
技术
编译期断言
通过不能使用大小为0的数组来实现,但是通过验证gcc是支持大小为0的数组,mscv是不支持
Loki不是通过使用大小为0的数组来实现。通过定义模板,特例化为true情况下,对于false情况因为没有具体的类实现,会报错
template <int> struct CompileTimeError;
template<> struct CompileTimeError<true>{};
#define LOKI_STATIC_CHECK(expr, msg) \
{Loki::CompileTimeError<((expr)!=0) Error_##msg; (void)ERROR_##msg;}
CRTP
Curiously Recurring Template Pattern,奇异递归模板模式
核心思想:
- 定义一个模板类(通常是基类),其模板参数是派生类的类型。
- 让派生类继承自这个模板基类,并将派生类自身作为模板实参传递给基类。


3847

被折叠的 条评论
为什么被折叠?



