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

Поиск:

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


pattern`щик
****


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

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



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

Цитата(mes @  4.12.2011,  16:42 Найти цитируемый пост)
не лишний ли в этом ряду ?

что подразумевалось?
PM WWW   Вверх
boostcoder
Дата 16.6.2012, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(mes @ 4.12.2011,  16:26)
Цитата(boostcoder @  4.12.2011,  15:22 Найти цитируемый пост)
boost.fusion::vector 

он с вариадиками же не работает ? или уже начал ?

кстати, то ли это в 4.7.1 пофиксили, то ли в бусте. но оно уже работает!
http://liveworkspace.org/code/1160db3c1c7a...4f1783e35bd6969

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


pattern`щик
****


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

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



теперь изначальную задачу можно решить так:
Код

#include <iostream>

#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/container/vector/vector_fwd.hpp>
#include <boost/fusion/include/vector_fwd.hpp>
#include <boost/fusion/algorithm/transformation/push_front.hpp>
#include <boost/fusion/include/push_front.hpp>
#include <boost/fusion/functional/invocation/invoke.hpp>

template < class C, class Res, class ...Args >
struct Delegate {
   Res (C::*m_fun)(Args...);
   C * m_obj;

   boost::fusion::vector<Args...> m_args;

   Delegate( Res (C::*fun)(Args...), C * obj, Args... args )
      :m_fun(fun)
      ,m_obj(obj)
      ,m_args(args...)
   {}

   Res run() {
      return boost::fusion::invoke( m_fun, boost::fusion::push_front( m_args, m_obj ) );
   }
};

template < class C, class Res, class ...Args >
struct Delegate< C, Res, Args... >
delegate( Res (C::*fun)(Args...), C * obj, Args... args ) {
   return Delegate<C, Res, Args...>( fun, obj, args... );
}

struct A {
   int foo( int x, int y ) { return x + y; }
};

int main() {
   A a;
   auto d = delegate( &A::foo, &a, 20, 22 );
   int y = d.run();
   std::cout << y << std::endl;
}

http://liveworkspace.org/code/1507c28023ee...4a49aaaa63b12f2
PM WWW   Вверх
borisbn
Дата 17.6.2012, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



boostcoder, спасибо (+1). Если потребуется в будущем - обязательно воспользуюсь. Жаль только, что всё это не включено в C++11. Так сказать искаропки...


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


pattern`щик
****


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

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



Цитата(borisbn @  17.6.2012,  01:02 Найти цитируемый пост)
Жаль только, что всё это не включено в C++11. Так сказать искаропки...

ну вот, только С++11 и почти все искаропки smile 
может кто подскажет как еще упростить?
Код

#include <iostream>
#include <tuple>

/***************************************************************************/
/***************************************************************************/
/***************************************************************************/

namespace details {

template<size_t... idxs>
struct index_list {
   typedef index_list<idxs..., sizeof...(idxs)> next;
};

template<size_t idx>
struct make_index_list {
   typedef typename make_index_list<idx-1>::type::next type;
};

template<>
struct make_index_list<0> {
   typedef index_list<> type;
};

} // ns details

/***************************************************************************/

template<typename C, typename Res, typename... Args>
struct Delegate {
   Res (C::*m_fun)(Args...);
   C * m_obj;

   typedef std::tuple<Args...> args_type;
   args_type m_args;

   Delegate( Res (C::*fun)(Args...), C * obj, Args... args )
      :m_fun(fun)
      ,m_obj(obj)
      ,m_args(args...)
   {}

   Res run() {
      return invoke(
          m_obj
         ,m_fun
         ,m_args
         ,typename details::make_index_list<sizeof...(Args)>::type()
      );
   }

private:
   template<typename F, size_t... indexes>
   Res invoke(C* obj, F func, args_type& args, details::index_list<indexes...>) {
      return (obj->*func)(std::forward<Args>(std::get<indexes>(args))...);
   }
};

/***************************************************************************/

template<typename C, typename Res, typename...Args >
struct Delegate< C, Res, Args... >
make_delegate( Res (C::*fun)(Args...), C * obj, Args... args ) {
   return Delegate<C, Res, Args...>( fun, obj, args... );
}

/***************************************************************************/
/***************************************************************************/
/***************************************************************************/

struct A {
   int foo( int x, int y ) { return x + y; }
};

/***************************************************************************/

int main() {
   A a;
   auto d = make_delegate( &A::foo, &a, 20, 22 );
   int y = d.run();
   std::cout << y << std::endl;
}

/***************************************************************************/

http://liveworkspace.org/code/b3688804be3d...9d99fb5f9a7028e
PM WWW   Вверх
borisbn
Дата 20.6.2012, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(boostcoder @  19.6.2012,  18:14 Найти цитируемый пост)
ну вот, только С++11 и почти все искаропки

Спасибо. С сотенной репой тебя


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


pattern`щик
****


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

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



Цитата(borisbn @  20.6.2012,  09:35 Найти цитируемый пост)
С сотенной репой тебя

не в этом цель была.
просто любопытство =)

PM WWW   Вверх
Страницы: (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.3202 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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