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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сохранение параметров variadic template, variadic template 
V
    Опции темы
borisbn
Дата 5.12.2011, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 22
Всего: 135



Цитата(boostcoder @  5.12.2011,  01:54 Найти цитируемый пост)
 что-то ты как-то внезапно пропал... вариант решения не устроил?

Всё гораздо проще - заснул smile (только из командировки...)
Вариант устроил (даже плюсанул). Спасибо.

Правильно ли я понимаю, что invoke bind'ит по-очереди параметры к указанной ф-ции ?

P.S. Жаль, что для такой простой (на мой неквалифицированный взгляд) задачи, как сохранение параметров var.template, нужна такая орава непростых классов (boost::mpl::push_front, boost::mpl::vector, boost::fusion::result_of::as_vector, boost::fusion::invoke). Плюс два квалифицированных программиста (mes + boostcoder).
Ну... это так. Мысли вслух. 


На самом деле ещё раз спасибо. Закрываю.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 5.12.2011, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(borisbn @  5.12.2011,  09:23 Найти цитируемый пост)
Правильно ли я понимаю, что invoke bind'ит по-очереди параметры к указанной ф-ции ?

честно? - даже не разбирался) фьюжн очень тяжело читается  smile 

Цитата(borisbn @  5.12.2011,  09:23 Найти цитируемый пост)
нужна такая орава непростых классов (boost::mpl::push_front, boost::mpl::vector, boost::fusion::result_of::as_vector

эти нужны только по тому, что компилятор пока не умеет разворачивать вариадик в список параметров. но это пока.
а в будущем, можно будет использовать std::tuple<...> и boost.fusion::invoke.
PM WWW   Вверх
mes
Дата 5.12.2011, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(borisbn @  5.12.2011,  08:23 Найти цитируемый пост)
задачи, как сохранение параметров var.template, нужна такая орава

для этой задачи достаточно стандартного tuple

Цитата(borisbn @  5.12.2011,  08:23 Найти цитируемый пост)
непростых классов (boost::mpl::push_front, boost::mpl::vector, boost::fusion::result_of::as_vector, boost::fusion::invoke)

в принципе нужен только аналог boost::fusion::invoke для tuple, тогда все это не нужно.. 




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


pattern`щик
****


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

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



Цитата(boostcoder @  5.12.2011,  09:45 Найти цитируемый пост)
компилятор пока не умеет разворачивать вариадик в список параметров

хотя, не знаю как это правильно объяснить... может mes подскажет.

Добавлено через 6 минут и 20 секунд
кстати, на гитхабе как-то встречал форк реализации то-ли boost.mpl то-ли boost.fusion с поддержкой вариадиков. но что-то особо не вдумывался для чего это. а наверное для того чтоб обходится без приведенных мною адаптеров..
PM WWW   Вверх
borisbn
Дата 5.12.2011, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 22
Всего: 135



Хммм. А у этой конструкции есть ограничения...
Например, нельзя "сопрячь" констовую ссылку и объект:
Код

struct A {
   void foo( int x, int y, const std::string & str ) {
       std::cout << str << " " << x + y << std::endl;
   }
};

int main() {
   A a;
   auto d = delegate( &A::foo, &a, 20, 22, std::string( "Hi!" ) );
   d.run();
}


http://liveworkspace.org/code/4be6766d51d7...83c0b2b98c265c9
ругается
Цитата

Compilation finished with errors:
source.cpp: In function 'int main()':
source.cpp:75:65: error: no matching function for call to 'delegate(void (A::*)(int, int, const string&), A*, int, int, std::string)'
source.cpp:75:65: note: candidate is:
source.cpp:63:1: note: template<class C, class Res, class ... Args> Delegate<C, Res, Args ...> delegate(Res (C::*)(Args ...), C*, Args ...)
source.cpp:75:65: error: unable to deduce 'auto' from '<expression error>'

если же сделать foo( int x, int y, std::string str ) - работает...



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 5.12.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(borisbn @  5.12.2011,  10:20 Найти цитируемый пост)
нельзя "сопрячь" констовую ссылку и объект

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

Добавлено через 14 минут и 39 секунд
ааа, нет!
сигнатура метода при вызове delegate() выводится из сигнатуры указываемого метода. а подставляемые аргументы не совпадают.

Добавлено через 14 минут и 58 секунд
но посредник там все равно есть smile 

Это сообщение отредактировал(а) boostcoder - 5.12.2011, 10:35
PM WWW   Вверх
boostcoder
Дата 5.12.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(boostcoder @  5.12.2011,  09:48 Найти цитируемый пост)
может mes подскажет.

нет, не хочет он общаться... smile 
PM WWW   Вверх
mes
Дата 5.12.2011, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  5.12.2011,  15:17 Найти цитируемый пост)
нет, не хочет он общаться...

у меня пока не было времени обдумать и ответить .. smile

Добавлено через 6 минут и 57 секунд
Цитата(boostcoder @  5.12.2011,  08:48 Найти цитируемый пост)
хотя, не знаю как это правильно объяснить... может mes подскажет

ну как граммотно это сказать  тоже не знаю..  проблема стоит в конвертации списка аргументов переменного размера в список фиксированного размера..

Добавлено через 8 минут и 9 секунд
под проблемой подразумевается создание fusion-контейнера  непосредственно из вариадика..

Добавлено через 10 минут и 7 секунд
std::bind хранит аргументы в tuple, и имеет средства его инвокинга, но это находится в _приватной_части_ и "недоступно" пользователю.. 



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


pattern`щик
****


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

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



да, кстати, вариадик разворачивается в std::tuple<> smile 
я думал что это не проблема fusion/mpl а проблема компилятора..
Код

#include <tuple>

template<typename... Args>
struct type {
   typedef std::tuple<Args...> args_type;
};

int main() {
   type<int> t1;
   type<int, double> t2;
   type<int, double, const char*> t3;
}


http://liveworkspace.org/code/e36900262a55...c1cc5fd45ccf8bf

Добавлено через 2 минуты и 26 секунд
mes, вчера же Вы дали ссылку на блог. я прочел, но так и не отметил тот факт что вариадики и кортежи дружат.
PM WWW   Вверх
mes
Дата 5.12.2011, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  5.12.2011,  18:05 Найти цитируемый пост)
да, кстати, вариадик разворачивается в std::tuple<> 

ммм.. позвольте уточнить Вы были не в курсе, что можно из аргументов вариадика построить std::tuple ?


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


pattern`щик
****


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

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



Цитата(mes @  5.12.2011,  19:11 Найти цитируемый пост)
не в курсе, что можно из аргументов вариадика построить std::tuple ?

да. точнее сказать, я полагал что при использовании std::tuple компилятор будет так же говорить что что-то там не реализовано.


Цитата(mes @  5.12.2011,  18:42 Найти цитируемый пост)
проблема стоит в конвертации списка аргументов переменного размера в список фиксированного размера

а разве это не тот случай?
Код

#include <iostream>
#include <tuple>

template<typename... Args>
struct type {
   typedef int args_t[sizeof...(Args)];
   args_t args;
   
   type(Args... a)
      :args{a...}
   {}
};

typedef type<int> tuple1;
typedef type<int, int> tuple2;
typedef type<int, int, int> tuple3;

int main() {
   tuple1 t1(1);
   tuple2 t2(1,2);
   tuple3 t3(1,2,3);
   
   std::cout
   << sizeof(tuple1::args_t) << std::endl
   << sizeof(tuple2::args_t) << std::endl
   << sizeof(tuple3::args_t) << std::endl
   ;
}


http://liveworkspace.org/code/0994d2d997f7...495d11a7c3b2a3f
PM WWW   Вверх
mes
Дата 5.12.2011, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  5.12.2011,  18:17 Найти цитируемый пост)
а разве это не тот случай?

тот случай здесь :
Код

template<typename T1, typename T2>
struct A {};

template<typename...Args>
struct B : A<Args...> {};


Добавлено через 5 минут и 13 секунд
Цитата(boostcoder @  5.12.2011,  18:17 Найти цитируемый пост)
 я полагал что при использовании std::tuple компилятор будет так же говорить что что-то там не реализовано.

удивительно.. ведь в той нашей многообсуждаемой теме это проскальзовало не раз..  smile 


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


pattern`щик
****


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

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



Цитата(mes @  5.12.2011,  19:22 Найти цитируемый пост)
в той нашей многообсуждаемой теме это проскальзовало не раз

там ведь мы fusion::vector использовали. нет? оО

Добавлено через 12 минут и 59 секунд
ну да. и в fusion::invoke() передавали.
PM WWW   Вверх
mes
Дата 5.12.2011, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  5.12.2011,  19:08 Найти цитируемый пост)
там ведь мы fusion::vector использовали. нет? 

не только, в тех примерах где были использованы вариадики, там был тьюпл.. 
кстати по теме , там был и пример инвокинга этого тьюпла (это если borisbn интересно, мне искать лень, слишком уж страниц много)) )



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


Эксперт
****


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

Репутация: 22
Всего: 135



Цитата(mes @  5.12.2011,  20:22 Найти цитируемый пост)
кстати по теме , там был и пример инвокинга этого тьюпла

этот apply и apply_inner - простые функции, а не методы класса.
Я попробовал переделать
http://liveworkspace.org/code/e7d6dd7ce1e3...c56abd587e04533
но запутался  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0847 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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