boost::lazy_enable_if_c を更に lazy にする

久々に 0x ではない C++ のコードを書いてみる.*1

書いたコードは,こんな感じ.

namespace pezzi
{
  template< class T >
  int _validate_type();
  
  template< class T, bool = true >
  struct lazy_identity_ {
    // nested typename `type' is not defined
  };
  
  template< class T >
  struct lazy_identity_< T,
    ( sizeof( _validate_type<typename T::type>() ) > 0 )
  >
  {
    typedef typename T::type type;
  };
  
  template< bool Cond, class T >
  struct lazy_enable_if_c
    : lazy_identity_<T> {};
  
  template< class T >
  struct lazy_enable_if_c< false, T > {};

} // namespace pezzi

http://ideone.com/jJBET


boost::lazy_enable_if_c との違いは, typename T::type が存在しない場合には, typename lazy_enable_if_c::type も定義されないようになっている点.
SFINAE 関連で便利…かもね?

*1: C++0x で書いてたら,たまたま C++03 でも動くコードになっただけ,とも言う.