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