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

设计模式种最熟知的是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()

后面有机会再多写点…

你可能感兴趣的:(C++20,设计模式)