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:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.