2010-01-23

それ、C++0xでできるよ!

コンセプトなしでテンプラ引数が、特定のメンバ関数を持ってるか調べられるの?

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を変態的に使えばできたりする。

本の虫: has_xxxの実装方法

No comments: