Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> подскажите с реализацией функции. 
V
    Опции темы
boostcoder
Дата 26.5.2011, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем доброго дня.

нужно понять, какой должна быть декларация/реализация функции, позволяющая использовать ее так:
Код

func({"tag", value}, {"tag2", value2});

т.е. кол-во аргументов должно быть variadic. в данном случае аргументов два.
тип аргумента({"tag", value}) - допустим std::pair<std::string, T>, где Т - шаблонный параметр.

я так полагаю, что тут нужно использовать initializer_list.
все. дальше мысли не идут.

спасибо.

Up.
по моему, как-то криво объяснил...
в общем, сейчас делаю так:
Код

json_props props; // json_props - тип, содержащий список пар.
props.add_prop(
   "prop_name1",
   prop_value1
);
props.add_prop(
   "prop_name2",
   prop_value2
);

net_query(client, props);

prop_name - всегда строка.
prop_value - значения произвольных типов.

т.е. сначала заполняю список свойств, потом передаю его как запрос.
сам принцип заполнения сильно раздражает. нет смысла создавать временный объект и заполнять его руками.
потому и хочу избавиться от json_props.

вот smile


Это сообщение отредактировал(а) boostcoder - 26.5.2011, 08:22
PM WWW   Вверх
mes
Дата 26.5.2011, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  26.5.2011,  06:48 Найти цитируемый пост)
позволяющая использовать ее так:

если добавить еще пару фигурных скобок, то можно сделать с initializer_list.

Добавлено через 2 минуты и 44 секунды
как то так :
Код

void fn (std::initializer_list<std::pair<int, std::string> > a ) 
{
   for ( auto it = a.begin(); it != a.end(); ++it)
   { 
       std::cout <<"{"<< it->first << "," << it->second << "} "; 
   } 
}

int main ()
{
   fn ({{ 1, "abc" }, {2, "def"}});
}


Добавлено через 4 минуты и 28 секунд
Цитата(boostcoder @  26.5.2011,  06:48 Найти цитируемый пост)
. нет смысла создавать временный объект

от этого не уйти.. только в одном случае он будет явно  в другом нет.. 






--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 26.5.2011, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  26.5.2011,  08:37 Найти цитируемый пост)
если добавить еще пару фигурных скобок, то можно сделать с initializer_list.

а как быть со вторым параметром инициализации? его тип может быть произвольным.

как вариант, завести нужное кол-во функций типа:
Код

template<typename T0>
void func(const std::pair<const std::string&, const T0&> arg0) {
}
template<typename T0, typename T1>
void func(const std::pair<const std::string&, const T0&>& arg0, const std::pair<const std::string&, const T1&>& arg1) {
}


вот только что-то я накосячил... и не пойму что не так.. smile 
http://liveworkspace.org/code/d4eb112c5c90...8a232223107a171

Добавлено через 1 минуту и 5 секунд
Цитата(mes @  26.5.2011,  08:37 Найти цитируемый пост)
только в одном случае он будет явно.  в другом нет

это понятно. это и имел ввиду.
PM WWW   Вверх
mes
Дата 26.5.2011, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  26.5.2011,  08:13 Найти цитируемый пост)
 его тип может быть произвольным.

не понятно, Вам нужно получить в итоге кортеж или массив ?



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 26.5.2011, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  26.5.2011,  09:52 Найти цитируемый пост)
Вам нужно получить в итоге кортеж или массив

массив pair`ов, где first - std::string, а second - произвольный тип.
 вот smile

PM WWW   Вверх
mes
Дата 26.5.2011, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  26.5.2011,  09:02 Найти цитируемый пост)
массив pair`ов, где first - std::string, а second - произвольный тип.

массив может быть только однородным.. или вы должны привести  произвольный тип к одному и пользоваться массивом, либо довольствоваться кортежами..



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 26.5.2011, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(boostcoder @  26.5.2011,  10:02 Найти цитируемый пост)
массив pair`ов

хотя нет.
можно чего-то типа:
Код

template<typename T>
struct mypair {
   std::string name;
   const T& value;
};


Цитата(mes @  26.5.2011,  10:25 Найти цитируемый пост)
массив может быть только однородным

это понятно. потому и ломаю голову..
PM WWW   Вверх
baldina
Дата 26.5.2011, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



раз json, то достаточно строк
PM MAIL   Вверх
mes
Дата 26.5.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  26.5.2011,  09:28 Найти цитируемый пост)
это понятно. потому и ломаю голову.. 

ну так что должно будет потом получиться из произвольного типа ?  что от него ожидается ?



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 26.5.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(baldina @  26.5.2011,  10:29 Найти цитируемый пост)
раз json, то достаточно строк 

нет.
раз json, то нужно сериализовать пользовательские типы и формировать json.
но спасибо.

Добавлено через 2 минуты и 12 секунд
Цитата(mes @  26.5.2011,  10:31 Найти цитируемый пост)
ну так что должно будет потом получиться из произвольного типа ?  что от него ожидается ?

ну вот, допустим, при помощи initializer_list, инициализировать аргументы в соответствии с:
Код

func({"tag", value}, {"tag2", value2});

а внутри func() сериализовать их и сформировать json-структуру.

PM WWW   Вверх
mes
Дата 26.5.2011, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  26.5.2011,  09:31 Найти цитируемый пост)
ри помощи initializer_list, инициализировать аргументы в соответствии с:

еще раз... initializer_list массив, а не кортеж..  приводить аргументы надо до попадания в него, а не после ..

Добавлено через 44 секунды
P.S. вспомните про (шаблонный) конструктор.. 


--------------------
PM MAIL WWW   Вверх
baldina
Дата 26.5.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(boostcoder @  26.5.2011,  10:31 Найти цитируемый пост)
нет.
раз json, то нужно сериализовать пользовательские типы и формировать json.

можно разделить уровни - где кончаются пользовательские типы и начинается json
если хочется типов, лучше явного добавления параметров в запрос не придумать
если хочется простоты типа javascript/php, придется поступиться типами
тут еще дело в том, что программа, формирующая json запрос понятия не имеет, какие _должны_ быть типы, так что все сводится к корректному преобразованию из пользовательского типа в строку

Добавлено через 37 секунд
Цитата(mes @  26.5.2011,  10:55 Найти цитируемый пост)
приводить аргументы надо до попадания в него, а не после ..

 smile

Добавлено через 2 минуты и 42 секунды
хорошей идеей мне кажется использования что-то типа boost::variant
PM MAIL   Вверх
boostcoder
Дата 26.5.2011, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  26.5.2011,  10:55 Найти цитируемый пост)
 initializer_list массив, а не кортеж

да, знаю. это я как пример привел.

Цитата(mes @  26.5.2011,  10:55 Найти цитируемый пост)
вспомните про (шаблонный) конструктор

так получается, что это единственный способ.. ок.
http://liveworkspace.org/code/7f4928a72ee9...f4c35768df4a0eb

остался второй вопрос:
Цитата(boostcoder @  26.5.2011,  07:48 Найти цитируемый пост)
кол-во аргументов должно быть variadic.


variadic-templates тут не поможет: http://liveworkspace.org/code/67bc8166f42f...c39f37e81ad30e5
что, тупо написать 10 функций(у меня минимум 3 значения и максимум 13) для нужного кол-ва аргументов?

Добавлено @ 11:09
Цитата(baldina @  26.5.2011,  11:00 Найти цитируемый пост)
можно разделить уровни - где кончаются пользовательские типы и начинается json

именно от этого и хочу избавиться.

Цитата(baldina @  26.5.2011,  11:00 Найти цитируемый пост)
если хочется типов, лучше явного добавления параметров в запрос не придумать

почему?

Цитата(baldina @  26.5.2011,  11:00 Найти цитируемый пост)
если хочется простоты типа javascript/php, придется поступиться типами

почему?

Цитата(baldina @  26.5.2011,  11:00 Найти цитируемый пост)
тут еще дело в том, что программа, формирующая json запрос понятия не имеет, какие _должны_ быть типы

почему?

зы
ух сколько вопросов smile

Добавлено @ 11:12
Цитата(baldina @  26.5.2011,  11:00 Найти цитируемый пост)
хорошей идеей мне кажется использования что-то типа boost::variant

а вот этого не надо.
мне нужна информация о типе.
и как показано в первом посте - у меня работает. понимает что за тип. и формирует значение соответствующего типа(строка/double/массив) smile 

Это сообщение отредактировал(а) boostcoder - 26.5.2011, 11:19
PM WWW   Вверх
baldina
Дата 26.5.2011, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



boostcoder, Вы не поняли.
прочитайте еще раз и подумайте
PM MAIL   Вверх
boostcoder
Дата 26.5.2011, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(boostcoder @  26.5.2011,  11:07 Найти цитируемый пост)
формирует значение соответствующего типа(строка/double/массив)

если массив - идем в рекурсию. и получается прям как это: http://en.wikipedia.org/wiki/Json#Data_typ...tax_and_example
и никакого рукоблудства smile

Добавлено через 1 минуту и 29 секунд
Цитата(baldina @  26.5.2011,  11:20 Найти цитируемый пост)
Вы не поняли

то, что я не понял, я как раз и понял. потому столько вопросов задал.

PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.