Russian Qt Forum
Ноябрь 26, 2024, 10:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Еще с темплейт  (Прочитано 7672 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Сентябрь 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 {...

void MyClass2::DelRows( void )
{
 ...
 for (int i = 0; i < count; ++i)
  node->data2.erase(i);
 ...
}
Др словами отличие только в разных контейнерах (data1 и data2) - но я не могу подать их в аргументах. Как здесь "схлопнуть"?

Спасибо
« Последнее редактирование: Сентябрь 07, 2015, 15:01 от Igors » Записан
Tuxford
Гость
« Ответ #1 : Сентябрь 07, 2015, 15:58 »

А node какого типа?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 07, 2015, 16:16 »

А node какого типа?
Одинакового для обоих классов
Записан
Tuxford
Гость
« Ответ #3 : Сентябрь 07, 2015, 16:29 »

Имхо с теплейтами не получится или что-то недопонял.

Вариант: в node добавить erase, который буде делать это уже непосредственно у data1 или data2?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Сентябрь 07, 2015, 16:35 »

Код:
template<typename Container>
void coolErase(Container &c, int count)
{
    for (int i = 0; i < count; ++i)
        c.erase(i);
}

void MyClass1::DelRows( void )
{
    ...
    coolErase(node->data1, count);
    ...
}

Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #5 : Сентябрь 07, 2015, 16:40 »

Код
C++ (Qt)
 
template <class R>
R & get(Node * node);
 
template<>
data1_type & get<data1_type>(Node * node)
{
   return node->data1;
}
 
template<>
data2_type & get<data2_type>(Node * node)
{
   return node->data2;
}
 
 
template <class T>
class MyClass : public MyBase {...
 
void MyClass::DelRows( void )
{
...
   for (int i = 0; i < count; ++i) {
       T & data = get(node);
       data.erase(i);  
   }
...
}
 
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 08, 2015, 08:32 »

Код:
template<typename Container>
void coolErase(Container &c, int count)
{
    for (int i = 0; i < count; ++i)
        c.erase(i);
}

void MyClass1::DelRows( void )
{
    ...
    coolErase(node->data1, count);
    ...
}
Так я экономлю только на строчке for, а практически одинаковые методы DelRows остаются у обоих классов

Код
C++ (Qt)
 
template <class R>
R & get(Node * node);
 
template<>
data1_type & get<data1_type>(Node * node)
{
   return node->data1;
}
 
Понял, но не устраивает "размах", все-таки планировалось наследование. Но все равно спасибо, сам бы не додумался  Улыбающийся
 
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #7 : Сентябрь 08, 2015, 12:20 »

Цитировать
Понял, но не устраивает "размах", все-таки планировалось наследование.
О каком размахе идёт речь? Спецмализация двух функций против реализации двух однотипных классов?

Цитировать
Но все равно спасибо, сам бы не додумался
Вообще это по сути паттерн type traits (класс характеристик), когда в зависимости от типа можно менять поведение:
Код
C++ (Qt)
template <class T>
struct MyTraits {};
 
template<>
struct MyTraits<data1_type>
{
   static data1_type some_action() { ...  }
   static other_type other_action() { ... }
   и т.д..
};
 
 
template <class T, class Traits = MyTraits<T>>
class MyClass : public MyBase {...
 
 

Т.е. у нас появляется возможность менять поведение MyClass не влезая в его внутренности.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 08, 2015, 12:44 »

О каком размахе идёт речь? Спецмализация двух функций против реализации двух однотипных классов?
Объявлять 2 класса темплейтными только для того чтобы схлопнуть один метод (строк 20)? Мне кажется лучше перетерпеть небольшой дубляж, но не усложнять код Улыбающийся

А нет ли возможности как-то замкнуть эти самые traits внутри класса?
Спасибо
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #9 : Сентябрь 08, 2015, 12:47 »

Цитировать
Объявлять 2 класса темплейтными только для того чтобы схлопнуть один метод (строк 20)? Мне кажется лучше перетерпеть небольшой дубляж, но не усложнять код
Не понял.. Вначале вы говорили, что
Цитировать
Др словами отличие только в разных контейнерах (data1 и data2)
Всё.. Пишите один шаблонный класс вместо двух нешаблонных реализаций.

Цитировать
А нет ли возможности как-то замкнуть эти самые traits внутри класса?
Можно:

Код
C++ (Qt)
template <class T>
void MyClass::DelRows( void )
{
...
   for (int i = 0; i < count; ++i) {
       T & data = get(node);
       data.erase(i);  
   }
...
}
 
« Последнее редактирование: Сентябрь 08, 2015, 12:50 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Сентябрь 08, 2015, 13:19 »

Всё.. Пишите один шаблонный класс вместо двух нешаблонных реализаций.
Так ведь объявив базовый с шаблоном я вынужден и оба дочерних объявлять с шаблонами. Оба класса - таблички, наследники QTreeWidget. Но содержимое айтемов совершенно разное, поэтому только удаление "совпало". Не смертельно, просто интересно какие есть ходы.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #11 : Сентябрь 08, 2015, 13:23 »

Цитировать
Так ведь объявив базовый с шаблоном я вынужден и оба дочерних объявлять с шаблонами.
Базовый не шаблонный.

Код
C++ (Qt)
template <class T, class Traits = MyTraits<T>>
class MyClass : public MyBase {};
 
typedef MyClacc<data1_type> MyClass1;
typedef MyClacc<data2_type> MyClass2;
 
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Сентябрь 08, 2015, 15:49 »

А можно так?
Код
C++ (Qt)
template <class T>
void DoErase( const T *, Node * node, size_t index )  { static_assert(false, "Invalid T"); }
 
template <>
void DoErase( const MyClass1 *, Node * node, size_t index )  { node->data1.erase(index); }
 
template <>
void DoErase( const MyClass2 *, Node * node, size_t index )  { node->data2.erase(index); }
 
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #13 : Сентябрь 08, 2015, 16:57 »

Можно и так..
Я думал (во всяком случае такой вывод можно сделать из вашей формулировки) что как раз вместо того, чтоб писать две реализации MyClass1/2 различающихся только тем, что в одном используется data1, а в другом data2, написать один шаблонный класс..

 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Сентябрь 08, 2015, 17:16 »

Я думал (во всяком случае такой вывод можно сделать из вашей формулировки) что как раз вместо того, чтоб писать две реализации MyClass1/2 различающихся только тем, что в одном используется data1, а в другом data2, написать один шаблонный класс..
Ну почему Вы вечно все путаете Злой  Я же только писал что нет

Но содержимое айтемов совершенно разное, поэтому только удаление "совпало".
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.387 секунд. Запросов: 23.