Я пишу обобщенный список для кодовой точки Юникода. Проблема в том, что мне также нужен какой-то общий класс, который позволяет специализированную версию. Вот пример.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++ я не могу доверять своему дизайну.
Как этот шаблон для вас? Хорошо или неправильно? Если это неправильно, что случилось?
Кажется, что хороший старый CRTP, если вы спросите меня, ничего плохого в этом. –
@j_kubik Я бы выбрал ваш комментарий в качестве ответа, если бы вы написали его как ответ. Этот материал CRTP, наконец, заставил мой мозг отправить предупреждающий сигнал. – Eonil
Кажется, слишком короткий для ответа, но если вам нравится ... –