Добра всем!
Уже второй раз натыкаюсь на странную вещь, которую не знал никогда и никогда не использовал, пример:
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;
}