2013-11-20 3 views
2

Я пишу обобщенный список для кодовой точки Юникода. Проблема в том, что мне также нужен какой-то общий класс, который позволяет специализированную версию. Вот пример.C++ общий класс с методами, возвращающими подкласс

Это пример.

class 
MyString 
{ 
public: 
    auto getItemAt(int index) const -> UnicodePoint const; 
    auto subsetInRange(int index, int length) const -> MyString const; 
    auto getUTF8Binary() const -> std::string const; 
}; 

Вот только один, но на самом деле, там уже куча методов, как subsetInRange, так что я не хочу повторять, чтобы написать их для других типов данных. Это заставляет меня писать универсальный суперкласс.

template<typename T, typename FINAL_SELF_TYPE> 
class 
MyList 
{ 
public: 
    auto getItemAt(int index) const -> T const; 
    auto subsetInRange(int index, int length) const -> FINAL_SELF_TYPE const; 
    // getUTF8Binary() removed because it's inappropriate on this abstraction level. 
}; 

class 
MyString : public MyList<UnicodePoint, MyString> 
{ 
public: 
    auto getUTF8Binary() const -> std::string const; 
}; 

Наконец, я должен был признать, что я должен пройти финальный тип класса в качестве параметра шаблона для MyList класса, чтобы сделать его работу должным образом. И это чувствует что-то не так. Я не могу сказать, что это точно, но мои мозги продолжают посылать предупреждающий сигнал. Я думаю, что это потому, что я помещаю некоторую информацию о специализации по абстрактному общему классу. Который кажется круговой зависимостью - в любом случае это нехорошо. Это полностью против иерархии классов.

Но когда я пишу некоторые общие классы, методы возвращают тот же самый тип в результате, я всегда вижу этот шаблон. Меня это раздражает. Из-за моего короткого опыта на C++ я не могу доверять своему дизайну.

Как этот шаблон для вас? Хорошо или неправильно? Если это неправильно, что случилось?

+1

Кажется, что хороший старый CRTP, если вы спросите меня, ничего плохого в этом. –

+0

@j_kubik Я бы выбрал ваш комментарий в качестве ответа, если бы вы написали его как ответ. Этот материал CRTP, наконец, заставил мой мозг отправить предупреждающий сигнал. – Eonil

+0

Кажется, слишком короткий для ответа, но если вам нравится ... –

ответ

2

Подробнее о CRTP. Это на самом деле довольно общий шаблон дизайна.

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