Название: Еще с темплейт Отправлено: Igors от Сентябрь 07, 2015, 14:57 Добрый день
Первый класс Цитировать class MyClass1 : public MyBase {... Второй класс похож но нацелен на др контейнерvoid MyClass1::DelRows( void ) { ... for (int i = 0; i < count; ++i) node->data1.erase(i); ... } Цитировать class MyClass2 : public MyBase {... Др словами отличие только в разных контейнерах (data1 и data2) - но я не могу подать их в аргументах. Как здесь "схлопнуть"?void MyClass2::DelRows( void ) { ... for (int i = 0; i < count; ++i) node->data2.erase(i); ... } Спасибо Название: Re: Еще с темплейт Отправлено: Tuxford от Сентябрь 07, 2015, 15:58 А node какого типа?
Название: Re: Еще с темплейт Отправлено: Igors от Сентябрь 07, 2015, 16:16 А node какого типа? Одинакового для обоих классовНазвание: Re: Еще с темплейт Отправлено: Tuxford от Сентябрь 07, 2015, 16:29 Имхо с теплейтами не получится или что-то недопонял.
Вариант: в node добавить erase, который буде делать это уже непосредственно у data1 или data2? Название: Re: Еще с темплейт Отправлено: Авварон от Сентябрь 07, 2015, 16:35 Код: template<typename Container> Название: Re: Еще с темплейт Отправлено: m_ax от Сентябрь 07, 2015, 16:40 Код
Название: Re: Еще с темплейт Отправлено: Igors от Сентябрь 08, 2015, 08:32 Код: template<typename Container> Код
Название: Re: Еще с темплейт Отправлено: m_ax от Сентябрь 08, 2015, 12:20 Цитировать Понял, но не устраивает "размах", все-таки планировалось наследование. О каком размахе идёт речь? Спецмализация двух функций против реализации двух однотипных классов?Цитировать Но все равно спасибо, сам бы не додумался Вообще это по сути паттерн type traits (класс характеристик), когда в зависимости от типа можно менять поведение:Код
Т.е. у нас появляется возможность менять поведение MyClass не влезая в его внутренности. Название: Re: Еще с темплейт Отправлено: Igors от Сентябрь 08, 2015, 12:44 О каком размахе идёт речь? Спецмализация двух функций против реализации двух однотипных классов? Объявлять 2 класса темплейтными только для того чтобы схлопнуть один метод (строк 20)? Мне кажется лучше перетерпеть небольшой дубляж, но не усложнять код :)А нет ли возможности как-то замкнуть эти самые traits внутри класса? Спасибо Название: Re: Еще с темплейт Отправлено: m_ax от Сентябрь 08, 2015, 12:47 Цитировать Объявлять 2 класса темплейтными только для того чтобы схлопнуть один метод (строк 20)? Мне кажется лучше перетерпеть небольшой дубляж, но не усложнять код Не понял.. Вначале вы говорили, чтоЦитировать Др словами отличие только в разных контейнерах (data1 и data2) Всё.. Пишите один шаблонный класс вместо двух нешаблонных реализаций. Цитировать А нет ли возможности как-то замкнуть эти самые traits внутри класса? Можно:Код
Название: Re: Еще с темплейт Отправлено: Igors от Сентябрь 08, 2015, 13:19 Всё.. Пишите один шаблонный класс вместо двух нешаблонных реализаций. Так ведь объявив базовый с шаблоном я вынужден и оба дочерних объявлять с шаблонами. Оба класса - таблички, наследники QTreeWidget. Но содержимое айтемов совершенно разное, поэтому только удаление "совпало". Не смертельно, просто интересно какие есть ходы. Название: Re: Еще с темплейт Отправлено: m_ax от Сентябрь 08, 2015, 13:23 Цитировать Так ведь объявив базовый с шаблоном я вынужден и оба дочерних объявлять с шаблонами. Базовый не шаблонный. Код
Название: Re: Еще с темплейт Отправлено: Igors от Сентябрь 08, 2015, 15:49 А можно так?
Код
Название: Re: Еще с темплейт Отправлено: m_ax от Сентябрь 08, 2015, 16:57 Можно и так..
Я думал (во всяком случае такой вывод можно сделать из вашей формулировки) что как раз вместо того, чтоб писать две реализации MyClass1/2 различающихся только тем, что в одном используется data1, а в другом data2, написать один шаблонный класс.. Название: Re: Еще с темплейт Отправлено: Igors от Сентябрь 08, 2015, 17:16 Я думал (во всяком случае такой вывод можно сделать из вашей формулировки) что как раз вместо того, чтоб писать две реализации MyClass1/2 различающихся только тем, что в одном используется data1, а в другом data2, написать один шаблонный класс.. Ну почему Вы вечно все путаете >:( Я же только писал что нетНо содержимое айтемов совершенно разное, поэтому только удаление "совпало". Название: Re: Еще с темплейт Отправлено: _Bers от Сентябрь 10, 2015, 20:54 овчинка не стоит выделки.
лучше не использовать шаблон. Название: Re: Еще с темплейт Отправлено: Igors от Сентябрь 11, 2015, 12:48 А можно так? Это ничего не дает - ведь вставить DoErase в базовый класс я не могу - вызовется первый вариант.Код
овчинка не стоит выделки. Можно просто виртуаломлучше не использовать шаблон. Код Но такие виртуалы мне придется делать для каждого обращения к data1/data2 :) Правда здесь оно 1 и есть. Если было бы больше - тогда наверное ото <traits> Название: Re: Еще с темплейт Отправлено: m_ax от Сентябрь 11, 2015, 15:57 Можно ещё так извратиться:
Код
|