Макрос для улучшения читабельности регистрации обратного вызова

Я пытаюсь написать макрос, чтобы упростить конкретное использование обратных вызовов в C ++. Все мои обратные вызовы являются функциями-членами и будут принимать this в качестве первого аргумента и второго, тип которого наследуется от общего базового класса.

Обычный путь:

register_callback(boost::bind(&my_class::member_function, this, _1));

Я бы с удовольствием написал:

register_callback(HANDLER(member_function));

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

Даже если typeof считается плохой практикой, это звучит как хорошее решение проблемы отсутствия макроса __class__ для получения текущего имени класса.

Следующий код работает:

typedef typeof(*this) CLASS;
boost::bind(& CLASS :: member_function, this, _1)(my_argument);

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

Я пробовал:

#define HANDLER(FUN)                                           \
    boost::bind(& typeof(*this) :: member_function, this, _1);

который не работает по непонятным мне причинам. Цитата из документации GCC:

typeof-конструкция может использоваться везде, где может использоваться имя typedef.

Мой компилятор - GCC 4.4, и даже если я предпочитаю что-то стандартное, принимаются решения, специфичные для GCC.


person Warren Seine    schedule 13.03.2010    source источник


Ответы (1)


Ваша проблема может заключаться в том, что typeof дает my_class&. Кажется, работает с boost::remove_reference:

#include <boost/bind.hpp>
#include <boost/type_traits.hpp>
#include <iostream>

struct X
{
    void foo(int i) { std::cout << i << '\n'; }
    void bar() {boost::bind(&boost::remove_reference<typeof(*this)>::type::foo, this, _1)(10); }
};

int main()
{
    X x;
    x.bar();
}

Возможно, было бы более переносимо использовать BOOST_TYPEOF, а в C ++ 0x decltype

person UncleBens    schedule 13.03.2010
comment
Спасибо. Я более подробно рассмотрю Boost.TypeTraits, похоже, это умный ответ на многие вопросы метапрограммирования шаблонов. - person Warren Seine; 13.03.2010