|
Boost : |
From: Beman Dawes (bdawes_at_[hidden])
Date: 2002-01-30 09:07:50
At 04:40 PM 1/29/2002, Aleksey Gurtovoy wrote:
>David Abrahams wrote:
>> I recently discovered that nontype template parameters other
>> than integers are much better supported across compilers
>> than I had previously expected, so now I'm on the lookout
>> for uses.
>
>And there are plenty of them - pointers to (member) functions as non-type
>template parameters are indeed unexpectedly cool and useful :). For
>example,
>here is a simple application of a compile-time state machine generator
>we've
>wrote recently:
>
> class player
> : state_machine<player>
> {
> private:
> typedef player self_t;
>
> // state invariants
> void stopped_state_invariant();
> void playing_state_invariant();
> void paused_state_invariant();
>
> // states
> typedef state<0, &self_t::stopped_state_invariant> stopped;
> typedef state<1, &self_t::playing_state_invariant> playing;
> typedef state<2, &self_t::paused_state_invariant> paused;
>
> private:
> // events
> struct start_event;
> struct stop_event;
> struct pause_event;
> struct resume_event;
>
> // transition functions
> bool do_start(start_event const&);
> bool do_stop(stop_event const&);
> bool do_pause(pause_event const&);
> bool do_resume(resume_event const&);
>
> // transitions, in the following format:
> // | current state | event | next state | transition function |
> friend class state_machine<player>;
> typedef boost::mpl::list<
^^^^^^^^^^^^^^^^
So when can we expect a submission for formal review?
--Beman
> transition<stopped, start_event, playing,
&self_t::do_start>
> , transition<playing, stop_event, stopped,
&self_t::do_stop>
> , transition<playing,
pause_event, paused, &self_t::do_pause>
> , transition<paused, resume_event, paused,
>&self_t::do_resume>
> >::type transition_table;
> };
>
> // event definitions
> struct player::start_event
> : player::event
> {
> };
>
> // ...
>
> int main()
> {
> player.process_event(player::start_event());
> return 0;
> }
>
>IMO, a programming language that allows you to do something like this is
>cool by definition :).
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk