Russian Qt Forum

Программирование => С/C++ => Тема начата: CuteBunny от Май 31, 2013, 14:20



Название: ООП, CRTP
Отправлено: CuteBunny от Май 31, 2013, 14:20
Добра всем!

Уже второй раз натыкаюсь на странную вещь, которую не знал никогда и никогда не использовал, пример:
Код
C++ (Qt)
// The Curiously Recurring Template Pattern (CRTP)
template<class Derived>
class Base
{
   // methods within Base can use template to access members of Derived
};
class Derived : public Base<Derived>
{
   // ...
};
 
На форуме уже упоминался CRTP, но я до сих пор не понимаю суть этой "технологии"?
В частности в вики написано, что одна из целей CRTP - избавиться от виртуальных методов.
В коде встречал места, где используется CRTP с виртуальными методами, пример:
Код
C++ (Qt)
#include <iostream>
#include <memory>
 
class abstract
{
public:
 
   virtual ~abstract() {}
 
   virtual void hello() = 0;
};
 
template <class T>
class base : public abstract
{
public:
 
   virtual void hello()
   {
       static_cast<T*>(this)->do_hello();
   }
 
private:
 
   void do_hello()
   {
       std::cout << "base::hello()" << std::endl;
   }
};
 
class left : public base<left>
{
public:
 
   void do_hello()
   {
       std::cout << "left::hello()" << std::endl;
   }
};
 
class right : public base<right>
{
 
};
 
int main()
{
   typedef std::auto_ptr<abstract> abstract_ptr;
 
   abstract_ptr a1(new left);
   abstract_ptr a2(new right);
 
   a1->hello();
   a2->hello();
 
   return 0;
}