コンセプトなしでテンプラ引数が、特定のメンバ関数を持ってるか調べられるの?
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