2010-07-31 34 views
10

cách chính xác để làm điều này với g ++ là gì:variadic mẫu cho lambda biểu thức

template < typename F > 
void g (F f); 

template < typename ... A > 
void h (A ... a); 

template < typename ... A > 
void f (A ... a) { 
    g ([&a]() { h (a...); }); // g++-4.6: error: parameter packs not expanded with »...« 
} 

Trả lời

16

Tôi nghĩ rằng bạn cần phải mở rộng các gói a trong danh sách chụp là tốt, như thế này:

template < typename ... A > 
void f (A ... a) { 
    g ([&, a...]() { h (a...); }); 
} 

Đây là văn bản có liên quan từ Bản nháp C++ 0x cuối cùng của Dự thảo, mục 5.1.2.23:

Chụp ảnh theo sau là dấu ba chấm là một mở rộng gói (14.5.3). [Ví dụ:

template<class... Args> void f(Args... args) { 
    auto lm = [&, args...] { return g(args...); }; lm(); 
} 

- end dụ]

+0

Cảm ơn bạn. g ++ - 4.6 không chấp nhận cú pháp này từ bản nháp: test01.cc:2:23: Fehler: expected »,« before »...« token – Thomas

+3

Tôi đã giải quyết nó bằng cách tạo một tuple, chuyển nó đến hàm lambda và giải nén ở đó. – Thomas

+3

Có vẻ như g ++ - 4.8 vẫn không chấp nhận cú pháp này, nhưng ICC 13.0.1 thực hiện: http://bit.ly/14auYGy – SCFrench

0
#include <functional> 
template < typename ... A > 
void f (A ... a) { 
    g (std::bind(h, a...)); 
} 
Các vấn đề liên quan