2011-07-09 88 views
5

我最近發現,函數指針的語法可以用下面的輔助類時,可以簡化爲:成員函數的typedef可以用helper模板類簡化嗎?

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

它讓我的指針,如下所示void()

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

我想創建一個類似的實用程序來創建成員函數指針的typedef。它將允許的語法如下:

struct Foo { 
    void bar() {} 
}; 

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

不過,我想不通typedef的語法:

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

相關問題