[Из песочницы] Учим старый-добрый CRTP новым трюкам

Иногда мы делаем вещи, ценность которых является весьма сомнительной. Это как раз тот самый случай.

Код лучше тысячи слов


Не буду тянуть кота за хвост, а перейду сразу к делу. Обычно мы используем CRTP примерно так:
template
struct Base
{};
 
template
void f(const Base&)
{}
 
struct Foo : Base
{};
 
int main()
{
  Foo foo;
  f(foo); 
}

Функции f() на самом деле всё равно, какой тэг у её аргумента, и она принимает объект любого типа, унаследованого от Base. Но не будет ли более удобным, если мы просто опустим не интересующий нас тэг? Зацените:
template
struct base_tag { typedef decltype(get_tag((t*)42)) type; };
 
template::type>
struct Base
{
  friend tag get_tag(type*);  //never defined
};
 
template
void f(const Base&)
{}
 
struct Foo : Base
{};
 
int main()
{
  Foo foo;
  f(foo);
}

Читать дальше →

© Habrahabr.ru