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