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.