Название: MetaData (Lite) Отправлено: Igors от Август 30, 2016, 09:04 Добрый день
Набегают новые фичи, к базовой структуре постоянно добавляются новые члены данных нужные для какого-то конкретного случая. Нормально сделать мапу чтобы по ключу добавлять/брать такие данные (вместо того чтобы менять структуру всякий раз). По смыслу QVariantMap подходит, но связываться с обильным QVariant не хочется, да и в данных файлах Qt нет, тащить его из-за такой мелочи не резон. Тогда как иначе? В принципе пока устраивает даже Код Т.к. данные POD. Но уж слишком вызывающе - С приведения, удаление void. Как бы это сделать аккуратнее и чтобы было скромно, компактно? Спасибо Название: Re: MetaData (Lite) Отправлено: Racheengel от Август 30, 2016, 10:19 сделать свой union ?
Название: Re: MetaData (Lite) Отправлено: ssoft от Август 30, 2016, 10:42 Лучше сделать по типу boost::any, там кода не так уж и много, зато не торчит никакой void *
Если кратко, то заводим AbstractHolder, для каждого типа от него порождаем Holder< _Type >. Строим Variant/Any поверх указателя на Holder. Простейший случай выглядит как-то так Код
Название: Re: MetaData (Lite) Отправлено: Old от Август 30, 2016, 10:47 Лучше сделать по типу boost::any, там кода не так уж и много, зато не торчит никакой void * Да уже даже есть готовое решение, горячО обсужденное. :)http://www.prog.org.ru/topic_28407_0.html Название: Re: MetaData (Lite) Отправлено: _Bers от Август 30, 2016, 22:51 Добрый день Набегают новые фичи, к базовой структуре постоянно добавляются новые члены данных нужные для какого-то конкретного случая. Нормально сделать мапу чтобы по ключу добавлять/брать такие данные (вместо того чтобы менять структуру всякий раз). По смыслу QVariantMap подходит, но связываться с обильным QVariant не хочется, да и в данных файлах Qt нет, тащить его из-за такой мелочи не резон. Тогда как иначе? В принципе пока устраивает даже Код Т.к. данные POD. Но уж слишком вызывающе - С приведения, удаление void. Как бы это сделать аккуратнее и чтобы было скромно, компактно? Спасибо сначала - void* затем, если будет актуально, время и желание - Arg. это - "умный void*" c возможностью проверки типизации и квалификатора const времени выполнения. суть такая: в зависимости от опций компиляции Arg сворачивается в тот же void*, или валидирует assert`ами. или валидирует exception`ами. Название: Re: MetaData (Lite) Отправлено: Igors от Август 31, 2016, 15:20 Если кратко, то заводим AbstractHolder, для каждого типа от него порождаем Holder< _Type >. Строим Variant/Any поверх указателя на Holder. Я пошел др путем (аттач) :), но получилось похоже - тоже holder, тоже выртуальная база и наследуемый от нее темплейтник. Да, эта конструкция делает все что требуется и неплохо расширяема, но колоссальный минус - всякое отсутствие желанной простоты :'( Вот если таких классов мало, они хорошо известны, "узаконены" в проекте и под рукой online help - тогда да, они полезны. А иначе они не стоят того чтобы с ними разбираться.Простейший случай выглядит как-то так сделать свой union ? И в деструкторе свитчеваться? И на get/set проверять тип сохраненный явно? Не, ну так я давно умею :) затем, если будет актуально, время и желание - Arg. это - "умный void*" c возможностью проверки типизации и квалификатора const времени выполнения. Цитировать Будете у нас на Колыме... :)Нет уж!! Лучше Вы у нам! Название: Re: MetaData (Lite) Отправлено: Racheengel от Август 31, 2016, 15:43 union позволяет избежать дополнительных аллокаций памяти и проверок рантайма (что бьёт по производительности). А насчет свитчей в деструкторе "моя не поняла". Достаточно юниона + одного флага, который хранит тип данных (я ж так понял, что все типы - должны быть чисто POD?)
Название: Re: MetaData (Lite) Отправлено: Igors от Сентябрь 01, 2016, 06:43 union позволяет избежать дополнительных аллокаций памяти и проверок рантайма (что бьёт по производительности). А насчет свитчей в деструкторе "моя не поняла". Достаточно юниона + одного флага, который хранит тип данных (я ж так понял, что все типы - должны быть чисто POD?) Пока POD, дальше хзКод Вот появится MyStruct3 всего лишь имеющий конструктор - и все, приплыли. Поэтому придется так Код Но тогда вылазят саитчи. В обоих случаях неприятно что все хедеры (где описаны MyStruct xxx) должны присутствовать, MyU "обо всех знает", а это хреново. |