2011-07-09 15 views
5

私は最近、以下のヘルパークラスを使用している場合、その関数ポインタの構文を簡素化することができるが見つかりました:メンバー関数のtypedefをヘルパーテンプレートクラスで簡略化できますか?

template<typename Sig> 
struct Fun { 
    typedef Sig* Ptr; 
}; 

次のようにそれは私にvoid()へのポインタを許可します。

typedef Fun<void()>::Ptr fun_ptr; 
fun_ptr f = foo; 

私は似を作成したいですメンバー関数ポインタへのtypedefを作成するためのユーティリティ。しかし、私は、typedefの構文を把握することはできません

struct Foo { 
    void bar() {} 
}; 

typedef MemFun<Foo, void()>::Ptr bar_type; 
bar_type b = &Foo::bar; 

:それは、次の構文を可能にする

template<class T, typename Sig> 
struct MemFun { 
    // How to use T and Sig to create member function typedef? 
}; 

誰でも助けることができますか?

+3

'std :: function'に何か問題がありますか?あなたのツールチェーンが古代の場合は 'boost :: function' ...これは長い時間前に既に全てが発明されています。 –

答えて

2
template<typename T, typename Sig> 
struct convenience { 
    typedef Sig T::*type; 
}; 

struct test { 
    void member() {} 
    void cmember() const {} 
}; 

static_assert(std::is_same< 
     convenience<test, void()>::type 
     , decltype(&test::member) 
    >::value, "Oops"); 

static_assert(std::is_same< 
     convenience<test, void() const>::type 
     , decltype(&test::cmember) 
    >::value, "Oops"); 

Sig引数が関数型である場合、結果の型は、メンバ関数へのポインタではなく、データメンバへのポインタです。特に、ここではvoid() constのような関数型が有効です。

+0

+1ちょうど...奇妙。 – fredoverflow

関連する問題