|
Boost : |
From: Rob Stewart (stewart_at_[hidden])
Date: 2004-09-04 18:21:42
From: Bronek Kozicki <brok_at_[hidden]>
>
> #include <cassert>
> #include <cstdio>
> #include <utility>
>
> // Copyright Bronislaw Kozicki 2003-2004. Use, modification and
> // distribution is subject to the Boost Software License, Version
> // 1.0. (See http://www.boost.org/LICENSE_1_0.txt )
>
> #ifndef __COMO__
> # if defined(_MSC_VER) && (_MSC_VER <= 1310)
> # define FAULTY
> # endif // _MSC_VER
> #endif // __COMO__
>
> template <bool> struct static_assert;
> template <> struct static_assert<true> {};
>
> class trampoline
> {
> private:
> typedef void(*_pf_t)(void *);
>
> template <typename Functor>
> struct _lever_t;
>
> template <typename Functor>
> struct _lever_t<Functor *>
> {
> static_assert<sizeof(Functor*) == sizeof(void *)> size;
>
> union convert
> {
> Functor* f;
> void* p;
> };
What if a void * and a pmf are not the same size? You at least
need a static assertion to that effect, right?
> static void exec(void * p)
> {
> convert c;
> c.p = p;
> (*c.f)();
> }
>
> static std::pair<_pf_t, void *> init(Functor* f)
> {
> convert c;
> c.f = f;
> return std::pair<_pf_t, void *>(&exec, c.p);
^^^^^
&_lever_t::exec
Unfortunately, the type of exec is
void (_lever_t<Function *>::*)(void *)
not
void (*)(void *)
as you've declared _pf_t. Thus, on any compiler that uses a
different function pointer type for pointers to member functions
and regular function pointers, will fail to compile this code.
(I haven't tested to learn if there are any, but even if there
aren't any today, there could be tomorrow.)
-- Rob Stewart stewart_at_[hidden] Software Engineer http://www.sig.com Susquehanna International Group, LLP using std::disclaimer;
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk