Boost logo

Boost :

Subject: Re: [boost] Discovering C++11 lambda argument and result types to construct boost::function
From: Jeffrey Lee Hellrung, Jr. (jeffrey.hellrung_at_[hidden])
Date: 2012-02-13 16:47:46


On Mon, Feb 13, 2012 at 11:08 AM, Frank Birbacher <bloodymir.crap_at_[hidden]>wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Hi!
>
> Am 12.02.12 17:37, schrieb Mathias Gaunard:
> > And that meta-function is just
> >
> > template<class F> struct function_type :
> > remove_pointer<decltype(&F::operator())> { };
>
> Well, that does not work for the following reason (example code below):
>
> "The same type as T, but with any pointer modifier removed. Note that
> pointers to members are left unchanged: removing the pointer
> decoration would result in an invalid type."
> (see:
>
> http://www.boost.org/doc/libs/1_48_0/libs/type_traits/doc/html/boost_typetraits/reference/remove_pointer.html
> )
>
> So this is the point: I need a signature from a member function. There
> is no type trait that does this. Any other suggestions?
>
[...]

Boost.FunctionTypes + Boost.MPL?

Something like

typename boost::function_types::function_type<
    typename boost::mpl::push_front<
        typename boost::function_types::result_type<F>::type,
        typename boost::mpl::pop_front<
            typename boost::function_types::parameter_types<F>::type
>::type
>::type
>::type

or define a metafunction that converts a pointer-to-member-function type to
the desired function type for some spectrum of arities:

template< class F > struct member_function_to_function;
template< class R, class T > struct member_function_to_function< R (T::*)()
> { typedef R type(); };
template< class R, class T > struct member_function_to_function< R (T::*)()
const > { typedef R type(); };
// etc...up to some maximum arity

- Jeff


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk