![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
День добрый.
Разбираюсь с variadic template. Захотелось набрасать такую штуку
http://liveworkspace.org/code/4299c32fb77d...2ea687a8a7b0942 получаю ошибки: в случае (1)
в случае (2)
скорее всего, ни то ни то неправильно, но, я думаю, вы понимаете, что хотелось сделать Вопрос: как сохранить переменное количество аргументов ? Спасибо. P.S. bind, function не предлагать. Я просто разбираюсь, и мне нужно не решение конкретной задачи, а научиться пользоваться variadic template'ми P.P.S. Эти темы http://stackoverflow.com/questions/1989552...-expand-identif http://stackoverflow.com/questions/4691657...ut-expanding-it http://www.cplusplus.com/forum/general/47084/ смотрел, и, в общем-то, там похожие вопросы, но там решается немного другие задачи Это сообщение отредактировал(а) borisbn - 4.12.2011, 14:38 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
в std::tuple<> или boost.tuple или boost.fusion::vector |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
весь код не смотрел, но по поводу вопроса tuple поможет.. по реализации первым напрашивается обернуть его в структуру, чтоб получить новый тип, и для полученого специализировать шаблонный инвокер.. (функцию обертку для применения аргументов к нужной функции).. Добавлено через 47 секунд он с вариадиками же не работает ? или уже начал ? |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
при использовании gcc-4.5.1-4.5.2 я писал адаптер. в 4.6.1-4.6.2 вроде уже должен. но не проверял. адаптер:
Добавлено через 3 минуты и 20 секунд ан нет. все еще недопилено:
http://liveworkspace.org/code/662ad39edfe8...c95296da8dc6422 Добавлено через 3 минуты и 44 секунды значит с использованием адаптера. |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
это первое, что советуют на СОшке. И с этим, вроде, всё понятно. Как теперь в ф-ции Delegate::run() вызвать
если m_fun - указатель на обычную ф-цию, которая принимает два инта (к примеру), а не tuple... -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
в прошлый рах раза два прочитал - не понял. Сейчас ещё раз перечитал раза три - рез-т тот же. "обернуть его в структуру, чтоб получить новый тип" - до сюда ясно "и для полученого специализировать шаблонный инвокер.. " - можете (если не сложно) в моей поделке добавить чего там не хватает ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
http://www.boost.org/doc/libs/1_48_0/libs/...ons/invoke.html только при помощи boost::fusion::push_front() сначала вставь адрес самого объекта. псевдокод:
Добавлено через 9 минут и 53 секунды да, и прочти про семейство функций invoke(). к счастью их всего три |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
пробую так
http://liveworkspace.org/code/fd421efe0c12...ce89a5764890d66 выдаётся миллион ошибок типа
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
какой-то баг похоже в бусте появился... или что-то изменилось, ибо банальный код перестал работать.
http://liveworkspace.org/code/ceeb6831c613...fc13be57b084114 обратите внимание на:
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ааа ,нет. это я затупил) Добавлено через 3 минуты и 4 секунды borisbn, позже доковыряю. спешу. http://liveworkspace.org/code/35b5fd6a6f3d...fac6dbcced127d1 Добавлено через 11 минут и 47 секунд все же доковырял. держи: http://liveworkspace.org/code/f1471c281476...54f545431246d06
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mes, угу, интересно.
Добавлено через 2 минуты и 15 секунд забавно |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
borisbn, что-то ты как-то внезапно пропал... вариант решения не устроил?
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Всё гораздо проще - заснул Вариант устроил (даже плюсанул). Спасибо. Правильно ли я понимаю, что invoke bind'ит по-очереди параметры к указанной ф-ции ? P.S. Жаль, что для такой простой (на мой неквалифицированный взгляд) задачи, как сохранение параметров var.template, нужна такая орава непростых классов (boost::mpl::push_front, boost::mpl::vector, boost::fusion::result_of::as_vector, boost::fusion::invoke). Плюс два квалифицированных программиста (mes + boostcoder). Ну... это так. Мысли вслух. На самом деле ещё раз спасибо. Закрываю. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
честно? - даже не разбирался) фьюжн очень тяжело читается
эти нужны только по тому, что компилятор пока не умеет разворачивать вариадик в список параметров. но это пока. а в будущем, можно будет использовать std::tuple<...> и boost.fusion::invoke. |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
для этой задачи достаточно стандартного tuple
в принципе нужен только аналог boost::fusion::invoke для tuple, тогда все это не нужно.. |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
хотя, не знаю как это правильно объяснить... может mes подскажет. Добавлено через 6 минут и 20 секунд кстати, на гитхабе как-то встречал форк реализации то-ли boost.mpl то-ли boost.fusion с поддержкой вариадиков. но что-то особо не вдумывался для чего это. а наверное для того чтоб обходится без приведенных мною адаптеров.. |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Хммм. А у этой конструкции есть ограничения...
Например, нельзя "сопрячь" констовую ссылку и объект:
http://liveworkspace.org/code/4be6766d51d7...83c0b2b98c265c9 ругается
если же сделать foo( int x, int y, std::string str ) - работает... -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
потому что аргументы от передаваемых и тобой до подставляемых в функцию, биндятся через посредника. а он создается из типов которые подставляешь ты в вызов. т.е. он не знает типов забиндинной функции. Добавлено через 14 минут и 39 секунд ааа, нет! сигнатура метода при вызове delegate() выводится из сигнатуры указываемого метода. а подставляемые аргументы не совпадают. Добавлено через 14 минут и 58 секунд но посредник там все равно есть Это сообщение отредактировал(а) boostcoder - 5.12.2011, 10:35 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
у меня пока не было времени обдумать и ответить .. Добавлено через 6 минут и 57 секунд
ну как граммотно это сказать тоже не знаю.. проблема стоит в конвертации списка аргументов переменного размера в список фиксированного размера.. Добавлено через 8 минут и 9 секунд под проблемой подразумевается создание fusion-контейнера непосредственно из вариадика.. Добавлено через 10 минут и 7 секунд std::bind хранит аргументы в tuple, и имеет средства его инвокинга, но это находится в _приватной_части_ и "недоступно" пользователю.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
да, кстати, вариадик разворачивается в std::tuple<>
я думал что это не проблема fusion/mpl а проблема компилятора..
http://liveworkspace.org/code/e36900262a55...c1cc5fd45ccf8bf Добавлено через 2 минуты и 26 секунд mes, вчера же Вы дали ссылку на блог. я прочел, но так и не отметил тот факт что вариадики и кортежи дружат. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ммм.. позвольте уточнить Вы были не в курсе, что можно из аргументов вариадика построить std::tuple ? |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
да. точнее сказать, я полагал что при использовании std::tuple компилятор будет так же говорить что что-то там не реализовано.
а разве это не тот случай?
http://liveworkspace.org/code/0994d2d997f7...495d11a7c3b2a3f |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
тот случай здесь :
Добавлено через 5 минут и 13 секунд
удивительно.. ведь в той нашей многообсуждаемой теме это проскальзовало не раз.. |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
там ведь мы fusion::vector использовали. нет? оО Добавлено через 12 минут и 59 секунд ну да. и в fusion::invoke() передавали. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не только, в тех примерах где были использованы вариадики, там был тьюпл.. кстати по теме , там был и пример инвокинга этого тьюпла (это если borisbn интересно, мне искать лень, слишком уж страниц много)) ) |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
этот apply и apply_inner - простые функции, а не методы класса. Я попробовал переделать http://liveworkspace.org/code/e7d6dd7ce1e3...c56abd587e04533 но запутался -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
при создании соседней темы, наткнулся на эту.
что подразумевалось? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
кстати, то ли это в 4.7.1 пофиксили, то ли в бусте. но оно уже работает! http://liveworkspace.org/code/1160db3c1c7a...4f1783e35bd6969 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
теперь изначальную задачу можно решить так:
http://liveworkspace.org/code/1507c28023ee...4a49aaaa63b12f2 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
boostcoder, спасибо (+1). Если потребуется в будущем - обязательно воспользуюсь. Жаль только, что всё это не включено в C++11. Так сказать искаропки...
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ну вот, только С++11 и почти все искаропки может кто подскажет как еще упростить?
http://liveworkspace.org/code/b3688804be3d...9d99fb5f9a7028e |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Спасибо. С сотенной репой тебя -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |