コンセプトなしでテンプラ引数が、特定のメンバ関数を持ってるか調べられるの?
SFINAEでできるよ!
// Overload Resolutionと併用する場合。 class has_xxx { typedef char yes_type ; typedef struct { char c[8]; } no_type ; // Unified Function Syntaxが入れば、autoではなく[]になる。 template< typename U > static auto check( void ) -> decltype( std::value<U>.xxx(), yes_type); template< typename U > static no_type check( void ) ; public: static bool const value = std::is_same< decltype(check<T>()), yes_type >::value ; } ;
// SFINAEのみでやる場合 template < typename T, typename U = void > struct has_xxx_impl { static const bool value = false ; } ; template < typename T > struct has_xxx_impl<T, decltype( std::value<T>.xxx() ) > { static const bool value = true ; } ; template < typename T > struct has_xxx : public has_xxx_impl< T > { } ;
なぜならば、C++0xでは、SFINAEの定義の仕方が変更されているからだ。これまでは、SFINAEになる場合を列挙していたが、これからは、規格で規定されている場合以外は、すべてSFINAEになる。また、sizeofやdecltypeの中身は、SFINAEの際に考慮される。
ちなみに、C++03でも、SFINAEを変態的に使えばできたりする。
No comments:
Post a Comment