
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 : mpl::eval_if < is_function<typename strip_function<F>::type>, function_types::result_type<F>, functor_result_type<F> > { }; Then: 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, Edd