2012-02-01 42 views
6

Tôi có đoạn mã sau:Làm thế nào để vượt qua một tham chiếu thông qua một gói tham số?

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

Hiện nay nó in 1000, có nghĩa là, giá trị mới của b bị mất ở đâu đó. Tôi đoán đó là vì foo chuyển các tham số trong gói thông số theo giá trị. Lam sao tôi co thể sửa no?

Trả lời

5

Bằng việc sử dụng tài liệu tham khảo:

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

này sẽ thất bại nếu 'a' là một rvalue, mặc dù rằng nên ngữ nghĩa cho phép. '&&' sẽ tốt hơn tôi nghĩ. – ildjarn

+0

@ildjarn bạn nói đúng. sửa mã số –

+0

Hoàn toàn phù hợp với nhu cầu của tôi nếu '&&' được sử dụng. – p12

7

như thế này:

#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; 
} 
Các vấn đề liên quan