В зависимости от того, что будет меняться в будущем, вы можете решить:
- Другие функции будут вызываться FireCallback переменной => указатель на mf может быть полезен, но другие механизмы более c ++ ish
- Будет вызываться только функция 'Callback' => придерживаться прямого вызова
arg->CallBack()
.
Возможное решение проблемы - использование интерфейсного уровня: это не более чем реализация шаблона Observer. Это немного больше ОО, поэтому многословно, но синтаксис намного проще.
class Observer {
public:
virtual ~Observer(){};
virtual void callback( int v ) = 0;
};
// actual implementation
class MyCallbackObserver : public Observer {
virtual void callback( int v ) { std::cout << v << std::endl; }
void some_other_method( int v ) { std::cout << "other " << v ; }
};
А у вашего Variable
класса будет контейнер, полный наблюдателей:
class Variable {
public:
std::vector<Observer*> observers; // warning: encapsulation omitted
void FireCallback(){
// assuming C++ 0x
for( auto it : observers ) {
(*it)->Callback( value );
}
}
Если другие функции необходимо вызывать для того же объекта, вы можете ввести оболочку:
class OtherCaller: public Observer {
public:
MyObserver* obs;
virtual void callback( int v ) { obs->some_other_method( v ); }
}
И добавьте его в коллекцию:
Variable var;
MyObserver m;
OtherCaller mo;
mo.obs = &m;
var.observers.push_back(&m);
var.observers.push_back(&mo);
var.FireCallback();