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

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

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

Сообщений: 11445


Просмотр профиля
« : Октябрь 15, 2019, 14:46 »

Добрый день

Мелкая вещь, но как-то "не выплясывается". Есть большой класс  и у него есть методы типа
Код
C++ (Qt)
void MyBigClass::ModifyData(..., const CModTarget & target );
Параметр target должен нести инфу о том "что нужно менять", это

1) какую компоненту данных, их всего 2, т.е. первую, вторую или обе
2) какой диапазон данных менять, один из вариантов
   а) те данные что сейчас "выбраны" (selected)
   b) данные в заданном диапазоне времени double [timeStart..timeStop]
   c) данные в заданном диапазоне кадров int [frameStart..frameStop]

Как бы Вы написали CModTarget? (название впрочем тоже неудачное). Всякая там крутизна с использованием новых стандартов - необязвтельно, но интересно. И еще - делать ли его глобальным или внутренним в MyBigClass ?

Спасибо
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #1 : Октябрь 15, 2019, 19:11 »

В виде патча, отдельным классом. Если есть опасность что его неправильно заюзают как отдельную сущность, то закрыть все методы, и зафрендить с "большим"
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 16, 2019, 10:36 »

Попробуем "вообще без класса". Вызов может выглядеть примерно так
Код
C++ (Qt)
dst->ModifyData(..., MyBigClass::component_A, MyBigClass::process_IntRange, range);
Не очень красиво + требуется еще вариант для диапазона double. Тогда может лучше нахрюкать вариантов вызовов
Код
C++ (Qt)
void MyBigClass::ModifyData(..., MyBigClass::component_A, const TIntRange & range );
void MyBigClass::ModifyData(..., MyBigClass::component_A, const TDoubleRange & range );
void MyBigClass::ModifyData(..., MyBigClass::component_A, MyBigClass::process_Selected );
...
 
Ну тоже как-то не очень. Там есть и др параметры (вместо многоточия), если и они будут варьироваться..

Напрашивающийся способ: объявить CModTarget пассивной struct и аккуратно заполнять ее при каждом вызове. Нормально, но длинновато/громоздко. Хотелось бы как-то проскочить с implicit конструктором, напр
Код
C++ (Qt)
dst->ModifyData(..., TIntRange(0, 10));
Но "компоненту" некуда девать, придется оформлять ее еще параметром..
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Октябрь 16, 2019, 17:15 »

Код:
[quote author=Igors link=topic=32530.msg240268#msg240268 date=1571211412]
 Хотелось бы как-то проскочить с implicit конструктором, напр
[code=cpp]dst->ModifyData(..., TIntRange(0, 10));
Но "компоненту" некуда девать, придется оформлять ее еще параметром..
[/quote]

Если параметры ктора разные, то можно просто юзать {}
Код
C++ (Qt)
dst->ModifyData(..., {0, 10});

Если вылезет ambigous overload (скажем, инт-дабл), то можно заюзать явный тэг (но это "некузяво")
Код
C++ (Qt)
static constexpr struct IntTag{} intTag;
dst->ModifyData(..., {intTag, 0, 10});
dst->ModifyData(..., {doubleTag, 0, 10.0})

Можно совместить подходы:
Код
C++ (Qt)
dst->ModifyData(..., {component_B, TDoubleRange{0, 10.0}}
dst->ModifyData(..., {component_A, TIntRange{0, 10.0}})
[/code]

Можно инвертировать (но зачем?):
TIntRange{0, 10.0}->ModifyData(dst, ..., component_A);
Вариантов на любой цвет и вкус, тут сложно дать какой-то совет "так-то лучше потому что", они все равноправны.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 17, 2019, 09:01 »

Вариантов на любой цвет и вкус, тут сложно дать какой-то совет "так-то лучше потому что", они все равноправны.
Ну или "все имеют недостатки" (что одно и то же).
Если вылезет ambigous overload (скажем, инт-дабл), то можно заюзать явный тэг (но это "некузяво")
Код
C++ (Qt)
static constexpr struct IntTag{} intTag;
dst->ModifyData(..., {intTag, 0, 10});
dst->ModifyData(..., {doubleTag, 0, 10.0})
Здесь нет "компоненты" и не охватывается вариант 2a (selection). Собсно 2 (или даже 3) параметра - ничего страшного нет, но не хочется загрязнять глобальное пр-во имен. Т.е. IntTag, component_A - это кто такие? А если занести их в класс, то раздувается вызов
Код
C++ (Qt)
dst->ModifyData(..., MyBigClass::component_A, {MyBigClass::intTag, 0, 10});
 
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Октябрь 17, 2019, 11:36 »

Здесь нет "компоненты" и не охватывается вариант 2a (selection).

Ну вы уже сами как-нибкдь додумайте 3й параметр=)

Т.е. IntTag, component_A - это кто такие? А если занести их в класс, то раздувается вызов

Если у вас есть ambigous вызов. Он у вас есть? Afaik, инт и дабл прекрасно резолвятся куда надо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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