Макрос для улучшения читаемости регистрации обратного вызова - PullRequest
0 голосов
/ 13 марта 2010

Я пытаюсь написать макрос, чтобы упростить конкретное использование обратных вызовов в 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, принимаются.

1 Ответ

1 голос
/ 13 марта 2010

Ваша проблема может быть в том, что 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

...