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

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

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

Сообщений: 4350



Просмотр профиля
« Ответ #15 : Июнь 03, 2016, 16:25 »

Можно специализировать getter_helper под различные пользоваткльские типы и дёргать его из функции:
Знаете что не нравиться: для каждого типа может быть только один хелпер. Например, для QPoint нельзя в одном случае считать по x, а в другом по y.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #16 : Июнь 03, 2016, 16:42 »

такое вообще бывает в нединамических языках? (ну кроме switch-enum подхода)
Не понял, что "бывает"? В смысле десятки ф-ций работающих с одним контейнером? Да, конечно
нет, чтобы
Цитировать
сосредоточить весь новый код в том что "подается на вход GetMaxNegative"
в objc с его «магией рантайма» я еще могу представить как это сделать, но в ++... вариант с лямбдами/функторами кажется вполне естественным.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Июнь 03, 2016, 17:31 »

... вариант с лямбдами/функторами кажется вполне естественным.
Пока одна содержательная/рабочая ф-ция - все хорошо.
Код
C++ (Qt)
getMaxNegative<double>( p.begin(), p.end(), []( const Point &v ){ return v.x; } )
Но беда в том что так придется писать для КАЖДОЙ рабочей ф-ции, напр
Код
C++ (Qt)
getMinPositive<double>( p.begin(), p.end(), []( const Point &v ){ return v.x; } )
А как только объявится еще "виртуальный контейнер" (хотя бы "y" вместо "x") - опять все для КАЖДОЙ

в objc с его «магией рантайма» я еще могу представить как это сделать, но в ++...
Шо за пессимизм?  Улыбающийся

Стремиться, имхо, надо к следующему:

Код
C++ (Qt)
template <class T>
int GetVectorValue(const T & vec, int index) const
{
   return vec[index];
}
 
...
 

Таким образом через параметры можно передать и вектор, и функтор для доступа к нему (если базовый не подходит).
Не вкурил, можно подробнее? Как (или куда) пристраивать написанное?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #18 : Июнь 03, 2016, 18:38 »

ну так идентичные лямбды делаются обычными функциями.

а если передавать в качестве параметра GetMaxNegative() еще и указатель на метод элемента контейнера?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #19 : Июнь 03, 2016, 19:24 »

Цитировать
Так мне кажется логичнее, но зачем нам засорять код рабочих ф-ций каким-то getter_helper'ом ? Почему не так
Ну так Вы же сами в первом посте потавили так вопрос. В любом случае где-то придётся руками прописывать поведение для конкретного типа. Здесь мы функцию зато не трогаем больше.

Цитировать
Знаете что не нравиться: для каждого типа может быть только один хелпер. Например, для QPoint нельзя в одном случае считать по x, а в другом по y.
Согласен) Можно ещё один шаблон добавить, который уже ракзличные стратегии определяет для данного типа..

Хотя я бы с лямбдами сделал и не запаривался)
Записан

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Июнь 04, 2016, 11:40 »

ну так идентичные лямбды делаются обычными функциями.

а если передавать в качестве параметра GetMaxNegative() еще и указатель на метод элемента контейнера?
Конечно можно, но это отягощает рабочие ф-ции. Два темплейт-аргумента вместо одного, плюс "default" реализация, плюс лямбды и/или функторы повсеместно. Когда ф-ций много это становится очень ощутимым.

Ну так Вы же сами в первом посте потавили так вопрос. В любом случае где-то придётся руками прописывать поведение для конкретного типа.
В исходном примере возвращаемое значение int (конкретный тип), т.е. меня не интересует что-то другое, нет планов адаптировать под double или еще что.

Вопрос был в том что исходные (хранимые) значения сами могут и не находиться в классе-контейнере, но для них существует ф-ционал:

- счетчик (число эл-тов)
- доступ к значению по индексу

Ну как бы "виртуальный контейнер" прямого доступа
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #21 : Июнь 04, 2016, 14:47 »

Не вкурил, можно подробнее? Как (или куда) пристраивать написанное?

Вторым параметром при необходимости (F* fvec):

template <class T, class F = GetVectorValue>
int GetMaxNegative( const T & vec, F* fvec  )

Примерно как:

GetMaxNegative(myVector, myFVector);

myFVector должен быть, соответвенно, заточен на обработку myVector.
Каждый раз для получения index элемента вектора будет вызвано myFVector ->GetVectorValue(myVector, index);

« Последнее редактирование: Июнь 04, 2016, 14:48 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Июнь 04, 2016, 15:17 »

Вторым параметром при необходимости (F* fvec):

template <class T, class F = GetVectorValue>
int GetMaxNegative( const T & vec, F* fvec  )
Понял, спасибо. Это близко к предложенным вариантам, но кажется мне поудобнее. Все же "вживление" специального геттера... Ведь следом за ним неизбежно последует сеттер. Зачем мы таким образом достигаем ф-ционала оператора [], не лучше ли перекрывать его если требуется ?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #23 : Июнь 04, 2016, 18:53 »

Ну а как без геттера? Ведь вектор уже имеет собственный оператор [], речь о том, чтобы специализировать "результат" оператора [].
Например, vec.x(), или vec.y() и т.д. - тут надо ж как-то явно указывать, что именно вам нужно.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #24 : Июнь 04, 2016, 21:33 »

Цитировать
Вопрос был в том что исходные (хранимые) значения сами могут и не находиться в классе-контейнере, но для них существует ф-ционал:

- счетчик (число эл-тов)
- доступ к значению по индексу

Ну как бы "виртуальный контейнер" прямого доступа
Т.е. предлагаете свой враппер писать под контейнер? Не совсем понимаю, чем это лучше специализации для геттера? В подходе с геттером гибкости больше: появилась потребность обращаться, например к point.y() - написали отдельную специализацию и т.д.. И от типа контейнера можно абстрогироваться (не обязательно по индексу обращаться к элементу).. 
Записан

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

Arch Linux Plasma 5
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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