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

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

Страниц: 1 2 [3] 4 5   Вниз
  Печать  
Автор Тема: (С++11) Variant - простой аналог boost::any  (Прочитано 37131 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Февраль 15, 2015, 16:04 »

Для иллюстрации данного примера это не принципиально..
А мне кажется - очень принципиально, именно такие "мелочи" хоронят вумный (или за-умный) код  Улыбающийся

Чтож Вы самое интересное то не показали?
Можно под капот TryConvert2Double посмотреть?)
Ну а чего ж нельзя?  Улыбающийся
Код
C++ (Qt)
bool TryConvert2Double( const Variant & v, double * result = 0 )
{
if (v.is_type<int>()) {
 if (result) *result = v.get<int> ();
 return true;
}
 
if (v.is_type<double>()) {
 if (result) *result = v.get<double> ();
 return true;
}
 
if (v.is_type<std::string>())
 return TryStr2Double(v.get <std::string> (), &result);
 
return false;
}
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #31 : Февраль 15, 2015, 18:52 »

А мне кажется - очень принципиально, именно такие "мелочи" хоронят вумный (или за-умный) код   Улыбающийся
Ну хорошо:
Код
C++ (Qt)
list.sort([&](variant_t v1, variant_t v2)->bool
   {
       try {
           return my_visitor(v1) > my_visitor(v2);
       } catch (...) {
           return false;
       }
   });
 

Ну а чего ж нельзя?  Улыбающийся
Код
C++ (Qt)
bool TryConvert2Double( const Variant & v, double * result = 0 )
{
if (v.is_type<int>()) {
 if (result) *result = v.get<int> ();
 return true;
}
 
if (v.is_type<double>()) {
 if (result) *result = v.get<double> ();
 return true;
}
 
if (v.is_type<std::string>())
 return TryStr2Double(v.get <std::string> (), &result);
 
return false;
}
А, ну теперь понятно на чём и как Вы бабло снимаете..  Улыбающийся

« Последнее редактирование: Февраль 15, 2015, 21:38 от m_ax » Записан

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

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

Сообщений: 4349



Просмотр профиля
« Ответ #32 : Февраль 15, 2015, 18:58 »

А, ну теперь понятно на чём и как Вы бабло снимаете..  Улыбающийся
А будет в варианте 10 возможных типов, будем для каждого значения проверять все десять типов. А при сортировке, так и по многу раз. Сойдет. Улыбающийся
« Последнее редактирование: Февраль 15, 2015, 19:27 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #33 : Февраль 16, 2015, 12:32 »

Ну хорошо:
Код
C++ (Qt)
list.sort([&](variant_t v1, variant_t v2)->bool
   {
       try {
           return my_visitor(v1) > my_visitor(v2);
       } catch (...) {
           return false;
       }
   });
 
Такая сортировка "нетранзитивна", о чем мы с Вами, батенька, уже не раз говорили. В том-то и дело что "просто отпихнуться" в Вашей схеме не удается

А будет в варианте 10 возможных типов, будем для каждого значения проверять все десять типов.
Да, будем, причем и Вы тоже  Улыбающийся

А при сортировке, так и по многу раз. Сойдет. Улыбающийся
Именно так. Не надо усложнять и накручивать пока это не вызывается необходимостью.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #34 : Февраль 16, 2015, 17:20 »

Код
C++ (Qt)
list.sort([&](variant_t v1, variant_t v2)->bool
 
Че это за синтаксис такой? О_о...
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #35 : Февраль 16, 2015, 19:09 »

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

Сообщений: 2094



Просмотр профиля
« Ответ #36 : Февраль 16, 2015, 20:29 »

Цитировать
Такая сортировка "нетранзитивна", о чем мы с Вами, батенька, уже не раз говорили. В том-то и дело что "просто отпихнуться" в Вашей схеме не удается
От чего отпихнуться? От длинных простыней с ifами на каждый тип во всех функциях? Суть обсуждаемого вопроса здесь именно в этом и состоит - нужно отпихнуться от этого..
А  транзитивность/нетранзитивность сортировки это уже нужно рассматривать в контексте конкретной задачи, например контролировать значения при формировании самого списка или.. ) 

Код
C++ (Qt)
list.sort([&](variant_t v1, variant_t v2)->bool
 
Че это за синтаксис такой? О_о...
O__o Лямбда же..)
  
« Последнее редактирование: Февраль 16, 2015, 20:32 от m_ax » Записан

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

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

Сообщений: 3258


Просмотр профиля
« Ответ #37 : Февраль 17, 2015, 10:13 »

Посмотрите как QVariant::operator< сделан
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Февраль 17, 2015, 10:40 »

А  транзитивность/нетранзитивность сортировки это уже нужно рассматривать в контексте конкретной задачи, например контролировать значения при формировании самого списка или.. ) 
Хорошо, говорю прямым текстом: Ваш функтор сортировки неверен. Пример (контейнеры вариантов)
Цитировать
{ 1, "abc" }
{ "abc", 1 }
Здесь ваш оператор < везде вернет false, как бы "все элементы равны". Для стандартного quicksort "сортированные" массивы и останутся такими же. Что это за сортировка если рез-т зависит от порядка исходных данных?

От чего отпихнуться? От длинных простыней с ifами на каждый тип во всех функциях? Суть обсуждаемого вопроса здесь именно в этом и состоит - нужно отпихнуться от этого..
"Удирая от пуделя Вы попадаете в лапы льва". Да, Вы несколько сократили текст и отбили десяток строк. Но ценой его усложнения, и теперь решить маленькую проблемку "некорректная строка" оказывается не так уж просто даже для автора красивой конструкции. А если писали не Вы, и нужно какое-то время чтобы вжиться в чужой код - поверьте, это несладко. В то же время лобовой код (тупой, убогий, примитивный - как хотите) не имеет с этим никаких проблем и понятен любому за минуты.

Ну хорошо, а если действительно там типов "много", напр не только int и double, но и char, short, long, float, signed/unsigned и.т.п. Здесь я бы постарался сделать "классы" (категории) вариантов, напр "числовой", "строковый", "указатель" и "кастом" - ну может что-то еще, но получается немного. Это покрыло бы большинство потребностей (пусть не все). Как это сделать с помощью "шаблонной магии" - не знаю, с удовольствием послушаю. Напр такое
Код
C++ (Qt)
if (v.IsNumeric())   // реально ли это без перебора?
double d = v.GetVal <double> ();
Спасибо
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #39 : Февраль 17, 2015, 12:08 »

Цитировать
Здесь ваш оператор < везде вернет false, как бы "все элементы равны". Для стандартного quicksort "сортированные" массивы и останутся такими же. Что это за сортировка если рез-т зависит от порядка исходных данных?
Правильно, поскольку сортировка для такого списка теряет смысл.. О чём я и говорил..

Цитировать
Ну хорошо, а если действительно там типов "много", напр не только int и double, но и char, short, long, float, signed/unsigned и.т.п. Здесь я бы постарался сделать "классы" (категории) вариантов, напр "числовой", "строковый", "указатель" и "кастом" - ну может что-то еще, но получается немного. Это покрыло бы большинство потребностей (пусть не все). Как это сделать с помощью "шаблонной магии" - не знаю, с удовольствием послушаю. Напр такое
Вот это как раз можно легко реализовать.. и boost::variant для этого всё предоставляет. Как? напишу чуть позже.. Сейчас бежать надо..) 
Записан

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

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

Сообщений: 4349



Просмотр профиля
« Ответ #40 : Февраль 17, 2015, 12:34 »

Правильно, поскольку сортировка для такого списка теряет смысл.. О чём я и говорил..
и должна быть максимально быстро прервана, например, исключением.
А уж если решили "сортировать" строки, которые однозначно не могут быть преобразованы в число, то  нужно сразу определиться и считать такие элементы равными нулю или -100500.
Все это легко укладывается в решение с визитерами без детского перебором всех типов стопитсот раз.

Как? напишу чуть позже..
Как снимать с этого бабло? Улыбающийся
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #41 : Февраль 17, 2015, 13:10 »

Посмотрите как QVariant::operator< сделан

Во, кстати, в Qt5 добавили относительное сравнение в QVariant. Видимо смысл всё-таки какой-то в этом есть. Значит выкидывать у себя точно не буду Улыбающийся
Записан

Гугль в помощь
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #42 : Февраль 17, 2015, 13:15 »

Во, кстати, в Qt5 добавили относительное сравнение в QVariant. Видимо смысл всё-таки какой-то в этом есть. Значит выкидывать у себя точно не буду Улыбающийся
Все таки any это не variant, IMHO.
Это больше хранилище для "всего". Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #43 : Февраль 17, 2015, 13:27 »

Правильно, поскольку сортировка для такого списка теряет смысл.. О чём я и говорил..
и должна быть максимально быстро прервана, например, исключением.
Во как - "теряет смысл". Сначала мы заявляем что наш вариант хранит что угодно, а теперь работаем "только с тем что можно", а иначе - любимое исключение, и разбирайтесь как хотите (хз как). Куда же делись все "концепты"?

А уж если решили "сортировать" строки, которые однозначно не могут быть преобразованы в число, то  нужно сразу определиться и считать такие элементы равными нулю или -100500.
Все это легко укладывается в решение с визитерами без детского перебором всех типов стопитсот раз.
Ну тогда уже -inf, хотя в любом случае это заплатка которая ни на какую концептуальность не претендует. И в чем кайф решения с визиторами? Чем оно принципиально лучше того же перебора? Если нужно поддерживать еще один тип, напр float - появляется еще один визитор. А в рамках др задачи - опять их все рисовать. Правильно я пониманию?

Зато что действительно достигнуто - куча понтов. Говоришь такому - неправильно сортирует, вылетает, исправь. Не тут-то было. Оно вступает в пререкания, начинает доказывать что это делать не нужно, упирается, в конце-концов, может быть, "сделает одолжение". Поверьте, его остроумные (иногда) решения отнюдь не компенсируют головной боли с ним.

Да, и вот
Посмотрите как QVariant::operator< сделан
По существу - перебором. Ну с некоторыми улучшениями, напр ID числовых типов собраны в одном диапазоне, поэтому быстрая проверка на canConvert и.т.п. Но это непринципиально
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #44 : Февраль 17, 2015, 13:45 »

Во как - "теряет смысл". Сначала мы заявляем что наш вариант хранит что угодно, а теперь работаем "только с тем что можно", а иначе - любимое исключение, и разбирайтесь как хотите (хз как). Куда же делись все "концепты"?
А при чем здесь концепты и не валидные для сортировки данные?
Как можно сортировать совместно числа и строки? Что больше 123 или "abc"?
Сообщите эти правила и я легко изменю функцию преобразования строки под ваши правила. Одну функцию исключительно для строки.

Ну тогда уже -inf
Да хоть -1. Это все ничего не значащие частности, которым вы пытаетесь придать огромное значение. Улыбающийся

хотя в любом случае это заплатка которая ни на какую концептуальность не претендует.
Конечно заплатка, вы не контролируете входные данные, в коллекцию "всего" набиваете "все", потом хотите это сортировать... В таком подходе без заплаток никуда.

И в чем кайф решения с визиторами? Чем оно принципиально лучше того же перебора?
Тем что в нем нет этого самого тупого перебора выполняющегося огромное число раз.

Если нужно поддерживать еще один тип, напр float - появляется еще один визитор.
Нет, визитер останется один.

Зато что действительно достигнуто - куча понтов. Говоришь такому - неправильно сортирует, вылетает, исправь. Не тут-то было.
А это не возможно исправить без допущений, а с допущением делается легко и не принужденно и не убивает все ресурсы процессора на перебор типов.
Ваше сравнение точно также использует допущения, как только один из элементов не число.
Повторюсь, формулируйте правила преобразования не числа в число и это легко можно реализовать.

Оно вступает в пререкания, начинает доказывать что это делать не нужно, упирается, в конце-концов, может быть, "сделает одолжение". Поверьте, его остроумные (иногда) решения отнюдь не компенсируют головной боли с ним.
Что-то вы расфантазировались под конец... Улыбающийся
Осторожненько, не подеритесь с этим. Улыбающийся
« Последнее редактирование: Февраль 17, 2015, 14:30 от Old » Записан
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 
Перейти в:  


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