2012-02-01 2 views
6

Ho il codice seguente:Come passare un riferimento attraverso un pacchetto di parametri?

#include <cstdio> 

template<class Fun, class... Args> 
void foo(Fun f, Args... args) 
{ 
    f(args...); 
} 

int main() 
{ 
    int a = 2; 
    int b = 1000; 

    foo([](int &b, int a){ b = a; }, b, a); 
    std::printf("%d\n", b); 
} 

Attualmente viene stampato 1000, vale a dire, il nuovo valore di b si perde da qualche parte. Immagino che sia perché foo passa i valori nel pacchetto di parametri per valore. Come posso ripararlo?

risposta

5

Utilizzando riferimento:

template<class Fun, class... Args> 
void foo(Fun f, Args&&... args) 
{ 
    f(std::forward<Args>(args)...); 
} 
+3

Questo fallirà se 'a' è un rvalue, anche se questo dovrebbe essere semanticamente ammissibile. '&&' sarebbe meglio penso. – ildjarn

+0

@ildjarn hai ragione. corretto il codice –

+0

Si adatta perfettamente alle mie esigenze se viene usato '&&'. – p12

7

come questo:

#include <iostream> 
#include <functional> 

template<class Fun, class... Args> 
void foo(Fun f, Args... args) 
{ 
    f(args...); 
} 

int main() 
{ 
    int a = 2; 
    int b = 1000; 

    foo([](int &b, int a){ b = a; }, std::ref(b), a); 
    std::cout << b << std::endl; 
}