2012-09-25 2 views
0

J'essaie d'implémenter le modèle d'observateur avec le catch dont j'ai besoin pour ajouter de nouvelles fonctionnalités dans chaque observateur plus tard dans le projet.Boost :: bind avec un espace réservé d'objet

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 
}; 

Mon méthode est notifier comme suit:

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); 
    } 
} 

Pour appeler d'informer le code est le suivant.

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

Maintenant, étant donné le contexte avec les blocs de code ci-dessus ma question utilise un espace réservé (_1) pour le paramètre objet bind correct ou est pas ce comportement?

La documentation boost sur bind ne spécifiait pas l'utilisation d'un espace réservé pour les objets uniquement pour les paramètres de fonction.

Répondre

1

Votre code est correct.

La documentation Boost.Bind indique que votre code

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

est le même que

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

boost::mem_fn est chargé d'invoquer le pointeur à fonction membre. Tant que l'objet lié est évalué avec quelque chose que boost::mem_fn peut utiliser, tel qu'un pointeur ou une référence, il appellera correctement la fonction.

+0

Je vois, je ne connais pas vraiment boost :: mem_fn alors je vais lire comment ça marche. Merci. – andre

+0

Après avoir lu plus dans ce que je comprends. Merci. – andre

Questions connexes