2011-07-09 13 views
5

Son zamanlarda, aşağıdaki yardımcı sınıfı kullanırken işlev işaretçisi sözdiziminin basitleştirilebildiğini buldum:Üye fonksiyonu yazarak yardımcısı şablon sınıfları ile basitleştirilebilir mi?

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

void() için bana bir işaretçi aşağıdaki gibi izin veriyor:

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

Benzer bir yardımcı program oluşturmak istiyorum üye işlev işaretçilerine bir yazım hatası oluşturmak için. Aşağıdaki sözdizimini sağlar:

struct Foo { 
    void bar() {} 
}; 

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

Ancak, yazım hatası sözdizimini anlayamıyorum:

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

Herkes yardımcı olabilir mi?

+3

std :: function' ile ilgili bir sorun mu var? Veya '' ringa '' işlevi eskideyse ... bu çoktan bir süre önce icat edildi. –

cevap

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 bağımsız değişken bir işlev türü, elde edilen tipi eleman özelliği, veri elemanına bir işaretçi için bir işaretçi. Özellikle, bu bağlamda void() const gibi işlev türleri geçerlidir.

+0

+1 Bu sadece ... tuhaf. – fredoverflow

İlgili konular