2012-08-10 29 views
12

std::function'da saklanan değişken sayıda parametre içeren bir üye işlevim var ve örneği bağlamak ve bağımsız bir işlev nesnesi almak istiyorum.bağlayıcı eleman işlevleri variadic moda

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

bağımsız değişkenler sabit sayı ı std::bind kullanmak isterdim ama variadic parametreler için bunun nasıl görmüyorum için. Zaten argümanlar miktarı ve her şeye sahip beri

+0

tam olarak nasıl Args 'alabilirim ...'? – Xeo

+0

Tamam, kodu farklı yazdım, umarım bu şekilde daha anlaşılırdır. –

+0

Evet, öyle. Ve çözümü oldukça kolaylaştırır. :) – Xeo

cevap

15

çözümü çok basittir:

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

Bu, çağrı yığında ek bir katman ekleyecektir, yani, bazı "std :: forward" sihrini eklemek zorundayım, böylece hiçbir yan etkisi olmaz, değil mi? –

+4

@lucas: Zekice mükemmel yönlendirme sihri bile sihirli bir şekilde 'std :: function' aracılığıyla çağrı yapmaz. ;) – Xeo

+0

: P Ama ihtiyaç duyulandan daha fazla şey kopyalamayacak. –