0xd34df00d
12.11.2012 13:28 Azoth_primary
QSettings некоторые примитивные типы хранит внутри себя как строки (например, bool — true/false, числа, и т. п.). Поэтому при считывании bool'евского значения получается QVariant со строкой, на самом деле. В обычном C++-коде с этим проблем нет, ибо потом все равно произойдет QVariant::toBool(), и из строки "true" получится нормальный себе бул.
А вот если этот QVariant потом передать в QML, то там уже строка "true" сама в булево значение true не перейдет, поэтому приходится городить вот такие костыли:
QVariant val = ...;
if (val.type () == QVariant::String)
{
if (val.canConvert<bool> ())
val = val.toBool ();
else if (val.canConvert<double> ())
val = val.toDouble ();
else if (val.canConvert<int> ())
val = val.toInt ();
}
Recommended by:
@pooq: моча съела говно
а там же есть какой-то convert().
нельзя ли вызвать val.convert(val.type()) ?
Неа. val.type() для этого случая String же.
грустный qt
Да. Какая-то недоутиная недотипизация.
Вообще вот всякие такие мелкие, но весьма геморройно обходимые просчеты в дизайне кутей очень печалят. Такое ощущение, что это песочница, шаг влево-вправо от типичных сценариев использования — все, глюки-лажа-говно.
зависимые типы просто
Што. Причем тут?
слишком тонко пошутил?
Да.
ну qt на ровном месте сделали тип, зависящий от строкового значения какой-то переменной, похоже (мне) на зависимые типы.
оффтопик: как твой стиль чатика называется?
То ли Satin, то ли Renkoo, все время забываю, а в настройки лезть лень. Renkoo, кажется, да.
статикопроблемы
Если бы.
ну срсли, любая десериализация в статически типизированном языке будет происходить через древние (ещё с дельфовских времён) костыли вроде TVariant, QVariant, Typeable и тому подобные (эмулирующие позднее связывание). И хорошо ещё, если для них есть удобный синтаксический сахар, как dynamic в сисярпе.
они-они. Ты *не знаешь* во время компиляции какой тип данных будешь вычитывать из файла.
ADT в х-лях вполне норм с этим справляются.
Тут проблема не в том, что я не знаю, какой тип читаю, а в том, что read . write не равно id.
> древние
> ADT
А мне норм.
потому что ADT рантайм-полиморфны, лол. С известным оверхедом в виде метки рантайм-типа (Data-конструктора) и постоянной диспетчеризации по нему.
х-ль спасается гибким синтаксисом, конечно. http://hackage.haskell.org/packages/arch...
http://hackage.haskell.org/packages/arch...
вон, красота.
Но в любом достойном уважения языке, ящитаю, должна быть синтаксическая поддержка динамических типов, потому что без них в некоторых важных местах вроде /0 никуда.
О плюсах, как обычно, промолчим.
Еще раз, проблема в /0 не в том, что ADT или варианты или что, а что нормальный тип не сохраняется, и все приводится к строке.
> ... и все приводится к битам
нет, это не фундаментальная проблема. Как раз вот взаимодействие статических и райнтаймных меток для интерпретации пачек битов — действительно нихуевая проблема.
В чем проблема-то? У тебя просто ПИТОНОМЫШЛЕНИЕ.