Boost logo

Boost Users :

Subject: Re: [Boost-users] Auto dispatch metaprogramming tricks
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2010-05-21 09:28:09


AMDG

Alexander Lamaison wrote:
> I would like to dispatch messages to a class based simply on the *presence*
> of a message handler method.
>
> Currently, the classes maintain an MPL vector of the messages they handle
> and must implement a on(message<MESSAGE_ID>) method for each one. The
> dispatcher uses this compile-time list to build the dispatching code. This
> means the information is maintained twice and may fall out of sync (e.g.
> adding the handler but forgetting to update the message vector.
>
> Are there any template metaprogramming tricks I can employ to dispatch the
> message to a handler method if it exists and the default handler otherwise?
> All this information is available at compile time. The question is are
> templates are powerful enough to make use of it?
>

Yes. The code looks something like this:

typedef char no;
struct yes { char dummy[2]; };

struct has_on_result {
    has_on_result operator,(int);
};

no check_on_result(const has_on_result&);
yes check_on_result(...);

template<class T>
struct has_on_impl : T {
    using T::on;
    has_on_result on(...);
};

template<class T, class M>
struct has_on : boost::mpl::bool_<
    sizeof(check_on_result(((has_on_impl<T>*)0)->on(*((M*)0)) , 0)) !=
sizeof(no)
> {};

In Christ,
Steven Watanabe


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net