| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > подскажите с реализацией функции. |
| Автор: boostcoder 26.5.2011, 07:48 | ||||
| всем доброго дня. нужно понять, какой должна быть декларация/реализация функции, позволяющая использовать ее так:
т.е. кол-во аргументов должно быть variadic. в данном случае аргументов два. тип аргумента({"tag", value}) - допустим std::pair<std::string, T>, где Т - шаблонный параметр. я так полагаю, что тут нужно использовать initializer_list. все. дальше мысли не идут. спасибо. Up. по моему, как-то криво объяснил... в общем, сейчас делаю так:
prop_name - всегда строка. prop_value - значения произвольных типов. т.е. сначала заполняю список свойств, потом передаю его как запрос. сам принцип заполнения сильно раздражает. нет смысла создавать временный объект и заполнять его руками. потому и хочу избавиться от json_props. вот |
| Автор: mes 26.5.2011, 08:37 | ||
если добавить еще пару фигурных скобок, то можно сделать с initializer_list. Добавлено через 2 минуты и 44 секунды как то так :
Добавлено через 4 минуты и 28 секунд от этого не уйти.. только в одном случае он будет явно в другом нет.. |
| Автор: mes 26.5.2011, 09:52 |
не понятно, Вам нужно получить в итоге кортеж или массив ? |
| Автор: boostcoder 26.5.2011, 10:02 |
массив pair`ов, где first - std::string, а second - произвольный тип. вот |
| Автор: mes 26.5.2011, 10:25 | ||
массив может быть только однородным.. или вы должны привести произвольный тип к одному и пользоваться массивом, либо довольствоваться кортежами.. |
| Автор: boostcoder 26.5.2011, 10:28 | ||
хотя нет. можно чего-то типа:
это понятно. потому и ломаю голову.. |
| Автор: baldina 26.5.2011, 10:29 |
| раз json, то достаточно строк |
| Автор: mes 26.5.2011, 10:31 |
ну так что должно будет потом получиться из произвольного типа ? что от него ожидается ? |
| Автор: boostcoder 26.5.2011, 10:31 | ||||
нет. раз json, то нужно сериализовать пользовательские типы и формировать json. но спасибо. Добавлено через 2 минуты и 12 секунд
ну вот, допустим, при помощи initializer_list, инициализировать аргументы в соответствии с:
а внутри func() сериализовать их и сформировать json-структуру. |
| Автор: mes 26.5.2011, 10:55 | ||
еще раз... initializer_list массив, а не кортеж.. приводить аргументы надо до попадания в него, а не после .. Добавлено через 44 секунды P.S. вспомните про (шаблонный) конструктор.. |
| Автор: baldina 26.5.2011, 11:00 | ||
можно разделить уровни - где кончаются пользовательские типы и начинается json если хочется типов, лучше явного добавления параметров в запрос не придумать если хочется простоты типа javascript/php, придется поступиться типами тут еще дело в том, что программа, формирующая json запрос понятия не имеет, какие _должны_ быть типы, так что все сводится к корректному преобразованию из пользовательского типа в строку Добавлено через 37 секунд Добавлено через 2 минуты и 42 секунды хорошей идеей мне кажется использования что-то типа boost::variant |
| Автор: boostcoder 26.5.2011, 11:07 | ||||||||||
да, знаю. это я как пример привел. так получается, что это единственный способ.. ок. http://liveworkspace.org/code/7f4928a72ee94fc31f4c35768df4a0eb остался второй вопрос: variadic-templates тут не поможет: http://liveworkspace.org/code/67bc8166f42f6f446c39f37e81ad30e5 что, тупо написать 10 функций(у меня минимум 3 значения и максимум 13) для нужного кол-ва аргументов? Добавлено @ 11:09
именно от этого и хочу избавиться.
почему?
почему?
почему? зы ух сколько вопросов Добавлено @ 11:12
а вот этого не надо. мне нужна информация о типе. и как показано в первом посте - у меня работает. понимает что за тип. и формирует значение соответствующего типа(строка/double/массив) |
| Автор: baldina 26.5.2011, 11:20 |
| boostcoder, Вы не поняли. прочитайте еще раз и подумайте |
| Автор: boostcoder 26.5.2011, 11:21 | ||
если массив - идем в рекурсию. и получается прям как это: http://en.wikipedia.org/wiki/Json#Data_types.2C_syntax_and_example и никакого рукоблудства Добавлено через 1 минуту и 29 секунд то, что я не понял, я как раз и понял. потому столько вопросов задал. |
| Автор: baldina 26.5.2011, 11:23 | ||
вот смотрите:
prop_value2 может принимать значения типа из некоторого набора типов. со значением "prop_name2" этот тип не связан. так что если у вас variant из того самого набора, то ничего не меняется. если же Вы захотите связать имя свойства и тип (что имхо излишне), это совсем другая история и архитектура Добавлено через 3 минуты и 33 секунды именно поэтому вся задача сводится к преобразованию типов в строки (сериализация), но не к проверке типов Добавлено через 7 минут и 33 секунды вообще, чувствуется желание задать параметры JSON естественным образом, синтаксически наиболее близким к javascript это можно сделать, перегружая операции (примерно как делается грамматика в boost::spirit) |
| Автор: boostcoder 26.5.2011, 11:33 | ||||||
| baldina, не понимаю что Вы хотите сказать.. из таких операций:
получаю это:
как Вы предлагаете такого добиться, не имея информации о типе? Добавлено через 1 минуту и 32 секунды
та я не проверяю типы! информация о типе мне нужна для того, чтоб соответствующим образом сформировать json-запись для этого типа! Добавлено через 1 минуту и 52 секунды вопрос закрыт. всем спасибо. |
| Автор: mes 26.5.2011, 11:59 | ||
сделать класс _свойство_, который будет принимать типизированное значение и приводить сразу к строке.. |
| Автор: boostcoder 26.5.2011, 12:04 | ||||
у меня так и происходит. только в методе add_prop() но я хочу избавиться от ручного кода и явного временного объекта. поэтому перенес в конструктор: http://liveworkspace.org/code/7f4928a72ee94fc31f4c35768df4a0eb теперь осталось понять каким образом написать функцию принимающую 3-13 аргументов... наверное придется написать 10 функций. ничего иного в голову не приходит.. Добавлено через 9 минут и 19 секунд в общем получилось как и хотел
|
| Автор: mes 26.5.2011, 12:24 | ||
не пойму, может сегодня магнитная буря ?.. делайте класс пары, который шаблонным конструктором принимает нужные аргументы и приводит их к строковому виду.. так как делает это add_prop.. а после применяете список инициализации.. |
| Автор: boostcoder 26.5.2011, 12:30 | ||
возможно но все равно, я не понимаю что Вы хотите сказать.. вопрос не о шаблонном кострукторе. и не в том, что он должен делать. а в том, как реализовать функцию принимающую произвольное кол-во моих пар. вот. тут три функции. а хочется одну.
http://liveworkspace.org/?id=cb7718bf15abd392498b2e2f499ef0c5 |
| Автор: mes 26.5.2011, 12:50 | ||
это зависит от того, что представляет собой пара.. вот например : http://liveworkspace.org/code/13b4276480f9f0e6ac9bdf2e5e4698ca |
| Автор: boostcoder 26.5.2011, 12:53 |
ааа.. теперь понял. я как-то не подумал о том, что можно завернуть initializer_list в initializer_list. буду знать. спасибо огромное. так подходит. вопрос закрыт...вроде как.. |
| Автор: boostcoder 29.5.2011, 05:21 | ||
mes, такой еще вопрос:
http://liveworkspace.org/code/0299c51fad60bd849a343a60d1325cdb |
| Автор: mes 30.5.2011, 08:14 | ||
абсолютно не понятно, что Вы пытаетесь спросить.. |
| Автор: boostcoder 30.5.2011, 11:16 |
| кажется понял.. проверю и отпишусь. |