2012-08-10 12 views
12

Tengo una función de miembro con un número variable de parámetros, almacenada en un std::function, y quiero vincular la instancia y obtener un objeto de función independiente.funciones de miembro de enlace de forma variada

template <class T, class R, class... Args> 
void connect(const T& t, std::function<R(const T&, Args...)> f) { 
    std::function<R(Args...)> = /* bind the instance c into the function? */ 
} 

// ... 

Class c; 
connect(c, &Class::foo); 

Para un número fijo de argumentos que usaría std::bind, pero no veo cómo hacer esto para los parámetros variadic.

+0

¿Cómo es exactamente lo que obtiene '' Args ...? – Xeo

+0

De acuerdo, escribí el código de manera diferente, con suerte es más comprensible de esta manera. –

+0

Sí, lo es. Y hace la solución bastante fácil. :) – Xeo

Respuesta

15

La solución es muy sencilla, puesto que ya tiene la cantidad de argumentos y todo:

template <class T, class R, class... Args> 
void connect(const T& t, std::function<R(const T&, Args...)> f) { 
    // or capture 't' by-value 
    std::function<R(Args...)> fun = [&t,f](Args... args){ f(t,args...); }; 
    // ... 
} 

Live example.

+0

Esto agregará una capa adicional en la pila de llamadas, es decir, tengo que agregar algo de magia 'std :: forward' para que no haya efectos secundarios, ¿no? –

+4

@lucas: Incluso la magia inteligente de reenvío perfecto no hará mágicamente que la llamada a través de 'std :: function' desaparezca. ;) – Xeo

+0

: P Pero no se copiarán más de lo necesario. –

Cuestiones relacionadas