Как и сейчас, прототип setRxHandler
получает указатель на функцию, которая ничего не возвращает, и принимает int
.Как вы заметили, это не будет работать с функциями-членами, потому что они не могут быть вызваны как обычные функции (вы должны также обработать указатель this
, что означает наличие экземпляра этого класса для вызова метода на).
Чтобы он работал как с функциями-членами, так и с неспецифическими ( generic ), вы должны либо создать базовый класс, и иметь все классы, которые вы хотите использовать setRxHandler
спроизводные от этого класса:
class Base { ... };
class Derived : public Base { ... };
// then for the prototype
void setRxHandler(void (Base::*h)(int)) { ... }
// and you can use setRxHandler for all types that derive from Base, which gives you more control than the second option, which is:
или использование шаблонов:
template<typename T>
void setRxHandler(void (T::*h)(int)) { ... }
С помощью опции шаблона вы действительно не можете контролировать, какой класс будет использоваться с setRxHandler
(исключая RTTI), что может быть именно тем, что вы хотите.