2011-07-09 11 views
5

Recientemente me encontré con que la sintaxis de puntero de función se puede simplificar cuando se utiliza la siguiente clase de ayuda:¿Puede simplificarse typedef de la función de miembro con clases de plantilla auxiliar?

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

Me permite un puntero a void() de la siguiente manera:

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

me gustaría crear un similares utilidad para crear un typedef a punteros de función de miembro. Esto permitiría a la siguiente sintaxis:

struct Foo { 
    void bar() {} 
}; 

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

Sin embargo, no puedo averiguar la sintaxis typedef:

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

¿Alguien puede ayudar?

+3

¿Hay algún problema con 'std :: function'? O 'boost :: function' si tu cadena de herramientas es antigua ... Todo esto ya se ha inventado, hace mucho tiempo. –

Respuesta

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"); 

Cuando el argumento Sig es un tipo de función, el tipo resultante es un puntero a la función miembro, no un puntero al miembro de datos. En particular, en este contexto, los tipos de función como void() const son válidos.

+0

+1 Eso simplemente ... extraño. – fredoverflow

Cuestiones relacionadas