Предположим, что мы имеем следующий класс с 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
? Есть ли преимущества/недостатки, если я их использую?
Нет, это не черты. – Yakk
Хорошо, тогда что это такое, поэтому я могу сделать это для Google ... – Nick
Это может быть (и есть) называется «mixin», что является термином, который существовал на более старых языках OO и, кажется, применим здесь. Я не знаю, есть ли лучшее имя для него. – Yakk