Boost :: bind с заполнителем объекта

Я пытаюсь реализовать шаблон наблюдателя с тем уловом, который мне нужен, чтобы добавить новые функциональные возможности каждому наблюдателю позже в проекте.

class Obsevers {
public:
virtual ~Obsevers() {}
};

class TestObserver : public Obsevers {
public:
void print1(int i) {
std::cout << i << std::endl;
}
};

class TestObserver2 : public Obsevers {
public:
void print2(int i, char c) {
std::cout << i << " , " << c << std::endl;
}
//possible new functions here later
};

Мой метод уведомления заключается в следующем:

template<typename Type, typename Notify>
void NotifyObserver(Notify notify) {
typedef std::list<Obsevers*>::iterator iter;
iter it = m_observers.begin();
iter end = m_observers.end();
for(; it != end; ++it) {
Type * o = dynamic_cast<Type*>(*it);
if(o == NULL) continue;
notify(o);
}
}

Для совершения звонка необходимо уведомить код следующим образом.

NotifyObserver<TestObserver2>(boost::bind(&TestObserver2::print2, _1, 32, 'b'));

Теперь, учитывая контекст с вышеупомянутыми блоками кода, мой вопрос использует заполнитель (_1) для параметра объекта в привязке правильно или это неопределенное поведение?

В расширенной документации по bind не указано использование заполнителя для объектов только для параметров функции.

0

Решение

Ваш код правильный.

Boost.Bind документация указывает на то, что ваш код

boost::bind(&TestObserver2::print2, _1, 32, 'b')

такой же как

boost::bind<void>(boost::mem_fn(&TestObserver2::print2), _1, 32, 'b')

где boost::mem_fn отвечает за вызов функции указателя на член. Пока связанный объект оценивается чем-то, что boost::mem_fn Можно использовать, например, указатель или ссылку, он будет правильно вызывать функцию.

1

Другие решения

Других решений пока нет …