Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: [C++] Использование типа из класса потомка
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
smalcom
Хотел использовать следующую конструкцию(вариант 1)

Код
template<typename TDerived>
class CBase
{
public:

    typename TDerived::DesiredType foo()
    {
    }
};

template<typename TDesiredType>
class CDerived : public CBase<CDerived<TDesiredType> >
{
public:

    typedef TDesiredType DesiredType;
};

CDerived<uint8_t> derived;


Основное желание - использовать в CBase тип из CDerived, переданный параметром шаблона - TDesiredType
Но компилятор не разделил мои желания и сказал:
Цитата
error: no type named 'DesiredType' in 'class Driver::CDerived<unsigned char>'


Переделал под более простой вариант 2. Но пропала элегантность:
Код
template<typename TDerived, typename TDesiredType>
class CBase
{
public:

    TDesiredType foo()
    {
    }
};

template<typename TDesiredType>
class CDerived : public CBase<CDerived<TDesiredType>, TDesiredType>
{
};

CDerived<uint8_t> derived;


Есть ли способ использовать вариант 1?
CrimsonPig
Цитата(smalcom @ Sep 18 2015, 09:41) *
Основное желание - использовать в CBase тип из CDerived, переданный параметром шаблона - TDesiredType
Но компилятор не разделил мои желания и сказал:


Это зачем ? Основная идея наследования это то, что базовый класс ничего не знает о производных.
Что конкретно-то хочется, можете на пальцах объяснить ?
Если просто хочется странного тогда да, уважаю.
smalcom
Нет, странностей захотелось не от скуки))

Суть такова: необходим класс-интерфейс. Но C++ напрямую не даёт такой вкусняшки. Сначала я пользовался абстрактными классами. Но потом стало жалко трат памяти(пусть и небольших).
И ещё бесило то, что при реализации потомка необходимо было угадывать - а какой-же метод я забыл реализовать, т.к. gcc просто пишет, что не может "сделать потомка".
Почитал и нашёл более красивое решение с рекурентными шаблонами
https://en.wikipedia.org/wiki/Curiously_rec...emplate_pattern

Получилось красиво и ненакладно по ресурсам. Но захотелось we need to go deeper добавить больших вкусняшек. И вот так родилась данная необходимость.

CrimsonPig
Цитата(smalcom @ Sep 18 2015, 10:06) *
Почитал и нашёл более красивое решение с рекурентными шаблонами
https://en.wikipedia.org/wiki/Curiously_rec...emplate_pattern


Хм, забавно.. почитаем.. sm.gif
smalcom
Вобщем, так как я хотел не получится. Так как надо указывать TDerived вместе с параметрами, тогда тип будет виден.Но в данном случае это глупо, используется при других способах проектирования.
Всё это блуждание побудило меня пересмотреть моё видение дерева классов, сделал немного по-другому.
CrimsonPig
Цитата(smalcom @ Sep 18 2015, 15:33) *
Вобщем, так как я хотел не получится. Так как надо указывать TDerived вместе с параметрами, тогда тип будет виден.Но в данном случае это глупо, используется при других способах проектирования.
Всё это блуждание побудило меня пересмотреть моё видение дерева классов, сделал немного по-другому.


Борьба с парадигмами программирования окончилась победой парадигм sm.gif
Паттерн да, интересный, но использовать надо с оглядкой..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.