[设计模式] 浅谈奇异递归模板模式

设计模式种最熟知的是23种经典设计模式,但奇异递归模板模式(Curiously Recurring Template Pattern, CRTP)是否有资格被单独当成一种设计模式,但是在C++种,CRTP确实是一种模式。其理念非常简单: 继承者将自身作为模板参数传递给基类

struct Foo : Base<Foo>
{
	...
}

这么做的一个原因是:可以在基类的实现中 访问特定类型 的this指针

假设积累Base的每个单一派生类均实现了迭代所需要的begin() && end()接口,那么如何在基类Base的内部而不是派生类的内部迭代对象?直觉告诉我们不能这么做,因为Base自身并没有提供begin() && end() 接口。但是,如果使用CRTP便可以将自身的信息传递给基类:

struct MyClass : Base<MyClass>
{
	class iterator{.....}
	iteretor begin() const {.....}
	iterator end() const {.....}
}

So,这意味着我们在基类的内部,可以将this指针转换为派生类的类型:

template <typename Derived>
struct Base
{
	void foo()
	{
		for (auto& item : *static_cast<Derived*> (this))
		{
			//.....
		}
	}
};

当MyClass的某个实例调用foo接口时,this指针将Base转为MyClass(下转型)。然后通过解引用这个指针,并在range-based for loop中实现迭代(通过调用MyClass::begin() && MyClass::end()

后面有机会再多写点…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值