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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Упростить макрос 
V
    Опции темы
ИванМ
Дата 18.10.2010, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 23



Есть такие макросы:
Код

#define HANDLER_1(Name_, Func_)\
    void Name_(Func_);    \
    template<typename Object, typename Function>\
    void Name_(Object& obj, Function func)\
    {\
        Name_(boost::bind(func, &obj, _1));\
    }
//........
#define HANDLER_4(Name_, Func_)\
    void Name_(Func_);    \
    template<typename Object, typename Function>\
    void Name_(Object& obj, Function func)\
    {\
        Name_(boost::bind(func, &obj, _1, _2, _3, _4));\
    }

Они отличаются друг от друга только количеством параметров в bind.
Можно ли как-то упростить задачу, чтобы писать не несколько похожих макросов, а только один?
PM MAIL   Вверх
boostcoder
Дата 18.10.2010, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(ИванМ @  18.10.2010,  01:16 Найти цитируемый пост)
_1, _2, _3, _4

вместо этого, вам нужно использовать макрос-перечислитель: http://www.boost.org/doc/libs/1_44_0/libs/...ted_params.html и в HANDLER передавать дополнительный числовой аргумент.

должно получиться что-то вроде этого:
Код

#define HANDLER(Name_, Func_, N_)\
    void Name_(Func_);    \
    template<typename Object, typename Function>\
    void Name_(Object& obj, Function func)\
    {\
        Name_(boost::bind(func, &obj, BOOST_PP_ENUM_SHIFTED_PARAMS(N_, _)));\
    }


Это сообщение отредактировал(а) boostcoder - 18.10.2010, 01:36
PM WWW   Вверх
ИванМ
Дата 18.10.2010, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 23



boostcoder, ваш код не работает. Как я понимаю, заполняется данными '_' , а надо _1, _2...
PM MAIL   Вверх
boostcoder
Дата 18.10.2010, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



у меня все корректно препроцессируется.
возможно вы забыли заинклудить <boost/preprocessor/repetition/enum_shifted_params.hpp>

Добавлено @ 07:54
конечный вариант:
Код

#define HANDLER(Name_, Func_, N_)\
   void Name_(Func_);    \
   template<typename Object, typename Function>\
   void Name_(Object& obj, Function func)\
   {\
      Name_(boost::bind(func, &obj, BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ADD(N_, 1), _)));\
   }



декларация:
Код

HANDLER(testfunc, bodyfunc, 4)


результат:
Код

void testfunc(bodyfunc);
template<typename Object, typename Function> void testfunc(Object& obj, Function func)
{
   testfunc(boost::bind(func, &obj, _1 , _2 , _3 , _4));
}



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


Опытный
**


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

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



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


pattern`щик
****


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

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



Цитата(cupper @ 18.10.2010,  09:18)
http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gc...Variadic-Macros

хорошо.
покажите способ, решить поставленную ТС`ом задачу, используя приведенную вами ссылку smile 
PM WWW   Вверх
cupper
Дата 18.10.2010, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include <stdio.h>

#define test(func, arg...) func(arg)

int func(int i) {printf("%d\n", i);}
int func(int i, int j) {printf("%d, %d\n", i, j);}

int main()
{
    test(func, 1);
    test(func, 2, 3);
}

Но это конечно если не лень ручками перечислять наборы параметров. 

Это сообщение отредактировал(а) cupper - 18.10.2010, 11:28
PM MAIL   Вверх
boostcoder
Дата 18.10.2010, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



cupper, вы наверное первый пост не прочитали.
PM WWW   Вверх
cupper
Дата 18.10.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



уже несколько раз перечитал. Но так и непонял откуда берутся параметры _1, _2, _3 smile
Если имена у них однотипные как и тут, то да буст сдесь лучше. А если они не обязательно имеют одинаковый формат имени? Но наверно сдесь всетаки первый вариант.
PM MAIL   Вверх
boostcoder
Дата 18.10.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(cupper @  18.10.2010,  11:32 Найти цитируемый пост)
так и непонял откуда берутся параметры _1, _2, _3

это плейсхолдеры.


Цитата(cupper @  18.10.2010,  11:32 Найти цитируемый пост)
А если они не обязательно имеют одинаковый формат имени?

обязательно.
PM WWW   Вверх
ИванМ
Дата 18.10.2010, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 23



boostcoder, вот теперь работает. Спасибо, плюс в репу.

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


pattern`щик
****


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

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



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

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

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

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

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


 




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


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

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