[enable_if] enable if member function present
I would like to able to provide two versions of a function where one is enabled for only POD types and other another if the object provides a usable member function (mainly used for compatible non POD types). Anything else should fail to compile. The first part is easy. I can do this with: template< class T > typename boost::enable_if< boost::is_pod<T>, void >::type DoSomething( T& object ) { ... } But, I'm not sure how to do the second part. For example: template< class T > typename boost::enable_if< has "DoSomething" member, void >::type DoSomething( T& object ) { Object.DoSomething(); } Perhaps it would be easier to check for a defined typedef inside the object? But, I'm not sure on that either. Additionally, if possible: If both conditions can be satisfied then the second version (member function) should be preferred. Is this possible? Thanks, -- Bill --
Bill Buklis
I would like to able to provide two versions of a function where one is enabled for only POD types and other another if the object provides a usable member function (mainly used for compatible non POD types). Anything else should fail to compile. The first part is easy. I can do this with:
template< class T > typename boost::enable_if< boost::is_pod<T>, void >::type DoSomething( T& object ) { ... }
But, I'm not sure how to do the second part. For example:
template< class T > typename boost::enable_if< has "DoSomething" member, void >::type DoSomething( T& object ) { Object.DoSomething(); }
Take a look at is_call_possible (http://preview.tinyurl.com/4x86m8) and can_be_called (http://preview.tinyurl.com/52rkj7).
Perhaps it would be easier to check for a defined typedef inside the object? But, I'm not sure on that either.
Additionally, if possible: If both conditions can be satisfied then the second version (member function) should be preferred.
Is this possible?
Yes, it's possible. template <class T> struct handle_pods { static do(T&); }; template <class T> struct handle_class_with_method { static do(T& t) { t.DoSomething(); } }; template <class T> void DoSomething(T& t) { typedef typename mpl::if_< has_do_something_method<T>, handle_class_with_method<T>, typename mpl::if< is_pod<T>, handle_pod<T>, int >::type
::type impl; impl::do(t); }
HTH, Roman Perepelitsa.
participants (2)
-
Bill Buklis
-
Roman Perepelitsa