2014-10-24 13 views
7

Tôi đang cố gắng chuyển số lượng đối số biến cho hàm lambda. nguyên mẫu để chấp nhận số biến số của các đối số trong hàm lambda là gì? tôi nên viết một hàm được đặt tên thay vì lambda?Làm thế nào để vượt qua số biến đối số cho hàm lambda

std::once_flag flag; 

template<typename ...Args> 
void gFunc(Args... args) 
{ 
} 

template<typename ...Args> 
void func(Args... args) 
{ 
    std::call_once(flag,[](/*accept variable number of arguments*/... args) 
         { 
           // more code here 
           gFunc(args...); 
         }, 
         args... 
         ); 
} 

chữ ký dưới đây cung cấp cho lỗi:

[&](){ } 
[&args](){ } 
[&args...](){ } 
[&,args...](){ } 
[&...args](){ } 

Trả lời

2

Hãy thử điều này:

template<typename ...Args> 
void func(Args... args) 
{ 
    std::call_once(flag,[&, args...]() 
         { 
         gFunc(args...); 
         }, 
         args... 
         ); 
} 

bị đánh cắp từ here

§ 5.1.2 A capture followed by an ellipsis is a pack expansion (14.5.3).

[ Example: 
template<class... Args> 
void f(Args... args) { 
auto lm = [&, args...] { return g(args...); }; 
lm(); 
} 
—end example ] 
+0

Nếu các gói lập luận được mở rộng, làm thế nào chúng ta có thể truy cập vào các gói lập luận một lần nữa? Chữ ký [this] (http://ideone.com/rwbzq9) không hoạt động. – ProgramCpp

+0

@ProgramCpp Nó hoạt động với [clang] (http://coliru.stacked-crooked.com/a/b83cb856787c83a3) và [gcc 4.9] (http://coliru.stacked-crooked.com/a/1a1a6a2da4b2881f) – P0W

+0

Cảm ơn bạn :) Tôi muốn chuyển chỉ args theo giá trị '[args ...]() {gFunc (args ...);};' – ProgramCpp

4

Trong C++ 14 bạn có thể làm

auto lambda = [](auto... args) {...}; 

Nhưng trong trường hợp của bạn tôi tin rằng chụp đơn giản là đủ:

std::call_once(flag, [&] { 
         gFunc(args...); // will implicitly capture all args 
        } 
       ); 
+0

[That] (http://ideone.com/RDEVJo) didn ' t làm việc. – ProgramCpp

+0

@ProgramCpp hoạt động wit [gcc 4.9 và clang 3.5] (http://coliru.stacked-crooked.com/a/29c9e344e1d7cafe) –

+0

cách bạn truy cập các đối số bên trong 'auto lambda = [] [auto ... args của bạn) {...}; ' – serup

Các vấn đề liên quan