2010-07-13 6 views
1

Selon l'exemple dans le documentation j'ai fait le code suivant qui ne parvient pas à compiler parce que custom_reaction <> ne semble pas correspondre au concept attendu en tant que troisième paramètre de modèle pour indiquer < >. Comment puis-je vraiment faire des points de choix? (J'ai également demandé cela sur la liste de boost)Boost.Statechart - problème avec la méthode documentée pour les points de choix

#include <boost/statechart/state_machine.hpp> 
#include <boost/statechart/simple_state.hpp> 
#include <boost/statechart/state.hpp> 
#include <boost/statechart/custom_reaction.hpp> 
#include <boost/statechart/event.hpp> 
#include <boost/statechart/transition.hpp> 
#include <boost/mpl/list.hpp> 

#include <iostream> 

namespace sc = boost::statechart; 

struct make_choice : sc::event<make_choice> {}; 

// universal choice point base class template 
template< class MostDerived, class Context > 
struct choice_point : sc::state< MostDerived, Context, 
    sc::custom_reaction<make_choice> > 
{ 
    typedef sc::state< MostDerived, Context, 
    sc::custom_reaction<make_choice> > base_type; 
    typedef typename base_type::my_context my_context; 
    typedef choice_point my_base; 

    choice_point(my_context ctx) : base_type(ctx) 
    { 
    this->post_event(boost::intrusive_ptr<make_choice>(
     new make_choice())); 
    } 
}; 

// ... 

struct MyChoicePoint; 
struct Machine : sc::state_machine< Machine, MyChoicePoint > {}; 

struct Dest1 : sc::simple_state< Dest1, Machine > {}; 
struct Dest2 : sc::simple_state< Dest2, Machine > 
{ 
    Dest2() { std::cout << "Dest2\n"; } 
}; 
struct Dest3 : sc::simple_state< Dest3, Machine > {}; 

struct MyChoicePoint : choice_point< MyChoicePoint, Machine > 
{ 
    MyChoicePoint(my_context ctx) : my_base(ctx) {} 

    sc::result react(const make_choice &) 
    { 
    if (0) 
    { 
     return transit<Dest1>(); 
    } 
    else if (1) 
    { 
     return transit<Dest2>(); 
    } 
    else 
    { 
     return transit<Dest3>(); 
    } 
    } 
}; 

int main() 
{ 
    Machine machine; 
    machine.initiate(); 

    std::cin.get(); 
} 

Répondre

0

Je pense que j'aurais pu trouver la réponse. J'attendrai la vérification de la liste d'amplification, mais il semble que le document est faux et si vous suivez les instructions dans l'exemple de la caméra pour faire des réactions personnalisées, cela fonctionne très bien. A savoir le modèle choice_point doit changer à ceci:

// universal choice point base class template 
template< class MostDerived, class Context > 
struct choice_point : sc::state< MostDerived, Context > 
{ 
    typedef sc::state< MostDerived, Context > base_type; 
    typedef typename base_type::my_context my_context; 
    typedef choice_point my_base; 

    typedef sc::custom_reaction<make_choice> reactions; 

    choice_point(my_context ctx) : base_type(ctx) 
    { 
    this->post_event(boost::intrusive_ptr<make_choice>(
     new make_choice())); 
    } 
}; 

Cela semble fonctionner, mais je vais attendre un peu au cas où les experts me disent que c'est faux.

+0

ok, bien pas de réponse dans boost.user et personne d'autre n'a de réponse. Cela semble fonctionner jusqu'à présent, alors j'accepte ma propre réponse. –