Boost logo

Boost :

Subject: Re: [boost] boost::bind result type
From: Edd Dawson (lists_at_[hidden])
Date: 2010-07-20 16:13:54

Hi David,

On 7/19/2010 10:37 PM, David Sankel wrote:

> I'd like to write something along these lines:
> template< typename StreamT, typename Sink>
> typename boost::result_of< boost::Bind( StreamT, boost::arg<1>, Sink )
>> ::type
> apSink( StreamT t, Sink sk )
> {
> return boost::bind( t
> , _1
> , sk
> );
> }

According to the bind docs, if StreamT is a function object, it needs to have a
result_type to be compatible with bind. If StreamT is a function or member
function you can use the function_types::result_type<> meta-function.

So could you not write a meta-function that asks if its parameter is a function
(once any pointer and reference baggage has been removed) and if so, use
function_types::result_type<>, else just use the result_type member which has to
be there anyway?

Something like this:

   // entirely untested

   template<typename F>
   struct functor_result_type
       typedef typename F::result_type type;

   template<typename F>
   struct strip_function :
       remove_pointer<typename remove_reference<F>::type>

   template<typename F>
   struct bindable_result_type :
           is_function<typename strip_function<F>::type>,


   template<typename StreamT, typename Sink>
   typename bindable_result_type<StreamT>::type
   apSink(StreamT t, Sink sk)
       return boost::bind(t, _1, sk);

Any good?

Kind regards,


Boost list run by bdawes at, gregod at, cpdaniel at, john at