2014年4月10日木曜日

MSVC11で、指定型について特定のシグニチャを持つメンバ関数があるかどうか調べるメタ関数を実装した

BOOST_TTI_HAS_MEMBER_FUNCTION使え(ぉ

派生が絡むとちょっと面倒くさかった。結果として以下の様な感じに。

template <typename T>
struct has_xxx
{
private:
    typedef char yes_t;
    typedef double no_t;

    template <typename F, F> struct Sfinae;
    template <typename U, void (U::*P)() const>
    struct Sfinae<void (U::*)() const, P> {};

    template <typename U> static yes_t check(Sfinae<decltype(&U::xxx), &U::xxx>*);
    template <typename U> static no_t check(...);

public:
    static bool const value = sizeof(yes_t) == sizeof(check<T>(0));
};

Sfinaeの特殊化でシグニチャを調整すればOK。この実装ならxxxが親クラス側で実装されていても正しく判定できる。