Seems like the following specialization of impl<> works:

 

 

   template <typename r>

   struct impl<true, r(void)>

   {

     static const bool value =

       sizeof(

            return_value_check<type, r>::deduce( (

             (((derived_type*)0)->operator()(),  details::void_exp_result<type>())

                         ) )

            ) == sizeof(yes);

 

   };

 

-Roshan

 

From: boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org] On Behalf Of Roman Perepelitsa
Sent: Monday, February 02, 2009 1:57 AM
To: boost-users@lists.boost.org
Subject: Re: [Boost-users] Using SFINAE to detect presence of member function - Unreliable

 

2009/1/31 Naik, Roshan <roshan.naik@hp.com>

Thanks Roman. It is kind of amazing!  Both has_member<> and is_call_possible<> are very interesting (even if a bit ugly).

 

But is_call_possible doesn't seem to work for member functions that don't have any arguments.  I tried twiddling with the implementation a bit and no luck yet.


Sorry, I don't know how to make it work for functions without arguments. Problem is that this program is invalid:
void foo() {}
void foo(...) {}

int main() {
  foo();  // Ambiguous.
}

Roman Perepelitsa.