2015-10-06 2 views
2

Предположим, что мы имеем следующий класс с virtual method:Альтернативы CRTP

struct icountable{ 
    virtual int count() = 0; 

    bool empty(){ 
     return count() == 0; 
    } 
} 

struct list : public icountable { 
... 
} 

Теперь предположим, что это может быть переписано с CRTP. Должен выглядеть более или менее:

template <typename T> 
struct icountable{ 
    bool empty(){ 
     return static_cast<T*>(this)->count() == 0; 
    } 
} 

struct list : public icountable<list> { 
... 
} 

Теперь предположим, что для класса не нужно использовать метод empty(). Тогда мы можем сделать что-то вроде этого:

template <typename T> 
struct icountable : public T{ 
    bool empty(){ 
     return count() == 0; 
    } 
} 

struct list_base{ 
... 
} 

typedef icountable<list_base> list; 

Мой вопрос для третьего примера. Это то, что называется traits? Есть ли преимущества/недостатки, если я их использую?

+0

Нет, это не черты. – Yakk

+0

Хорошо, тогда что это такое, поэтому я могу сделать это для Google ... – Nick

+3

Это может быть (и есть) называется «mixin», что является термином, который существовал на более старых языках OO и, кажется, применим здесь. Я не знаю, есть ли лучшее имя для него. – Yakk

ответ

0

В комментариях говорят, что это смешанная концепция, и вы можете найти информацию об этом here.

Характеристики разные, и here вы можете найти базовый пример.

Смежные вопросы