2009/6/30 Sakharuk, Vlad (GMI Development) <Vlad_Sakharuk@ml.com>
Here is example: class one { public: typedef someclass internal; };
class two { // No internal class };
class default_internal{ };
I would like to be able to write something if it possible:
template<class T, class B = if_exist(T::internal) T::internal else default_internal > class proc { };
So I can use proc with both
proc<one> One; proc<two> Two;
without specifying derived type?
#include <iostream> #include <boost/mpl/has_xxx.hpp> #include <boost/mpl/eval_if.hpp> #include <boost/mpl/identity.hpp> struct someclass { static void hello() { std::cout << "someclass" << std::endl; } }; struct one { public: typedef someclass internal; }; struct two {}; struct default_internal { static void hello() { std::cout << "default_internal" << std::endl; } }; BOOST_MPL_HAS_XXX_TRAIT_DEF(internal) // Here Internal is either T::internal // if it exists or default_internal. template <class T, class Internal> struct proc_impl { static void hi() { Internal::hello(); } }; template <class T> struct get_internal { typedef typename T::internal type; }; template <class T> struct proc : proc_impl< T, typename boost::mpl::eval_if< has_internal<T>, get_internal<T>, boost::mpl::identity<default_internal> >::type
{ };
int main() { proc<one>::hi(); proc<two>::hi(); } Roman Perepelitsa.