2013-01-16 37 views
8

Nó sẽ được tốt đẹp nếu tôi có thể làm như sau:có hỗ trợ chụp lambda variadic đối số mẫu

template <class RT, class... PT> 
class Event 
{ 
    ... 
    void operator()(PT... args) 
    { 
     std::for_each(
      l.begin(), l.end(), [args...](Handler *p) { (*p)(args...); } 
     ); 
    } 
    ... 
}; 

Đáng tiếc là tôi không thể làm cho nó biên dịch với g ++ 4.7.2 (-std = C++ 0x) :

evtempl.hh: In member function 'void elt::Event::operator()(PT ...)': evtempl.hh:75:54: error: expected ',' before '...' token evtempl.hh:75:54: error: expected identifier before '...' token evtempl.hh:75:57: error: parameter packs not expanded with '...': evtempl.hh:75:57: note: 'args' evtempl.hh: In lambda function: evtempl.hh:76:26: error: expansion pattern 'args' contains no argument packs evtempl.hh: In instantiation of 'void elt::Event::operator()(PT ...) [with RT = void; PT = {int}]': testevtempl.cc:28:9: required from here evtempl.hh:74:9: error: using invalid field 'elt::Event::operator()(PT ...)::::Handler*)>::__args' evtempl.hh: In instantiation of 'void elt::Event::operator()(PT ...) [with RT = void; PT = {int, const char*}]': testevtempl.cc:29:20: required from here evtempl.hh:74:9: error: using invalid field 'elt::Event::operator()(PT ...)::::Handler*)>::__args'

thay vào đó, tôi phải thay đổi lambda đó đến già, cú pháp trần tục:

for (itr = l.begin(); itr != l.end(); ++itr) 
    (*(*itr))(args...); 

Cái này biên dịch và các công trình vây e.

Tôi tự hỏi tại sao cú pháp lambda không hoạt động.

  1. Tôi đã làm điều gì sai hoặc bỏ lỡ điều gì đó?
  2. Điều đó có bị cấm theo tiêu chuẩn C++ 11 không?
  3. hoặc, điều này được phép theo tiêu chuẩn, nhưng đó là sự cố của trình biên dịch hiện tại?

tôi đã cố gắng

[=](Handler *p) { (*p)(args...); } 

nó mang lại cho các lỗi tương tự như khi bạn đã làm:

[args](Handler *p) { (*p)(args...); } 

tham số phàn nàn boå không mở rộng

+3

Bạn đã thử '[=]' thay thế? –

+0

@Kerrek SB gợi ý tốt, nhưng nó không hoạt động hoặc –

+3

Nếu bạn cô lập lambda 'auto foo = [=] (Handler * p) {(* p) (args ...); }; ', bạn nhận được hai lỗi" 1) Gói thông số không được mở rộng và 2) mẫu mở rộng 'args' không chứa gói tham số ". Tôi nghi ngờ rằng đó là một lỗi GCC, vì nó complaing rằng args là cả hai không phải là một gói và phải là một. –

Trả lời

6
+0

Thật vậy, nó đã được một lỗi trong một thời gian rất dài đã và theo như tôi biết nó vẫn là một lỗi trong gcc 4,8 và kêu vang. – gnzlbg

+0

@gnzlbg, nó không phải là một lỗi trong tiếng lóng. –

+0

@chico Tuyệt vời! Cảm ơn! Tôi không biết nó đã hoạt động như thế nào rồi! Nếu chỉ mở rộng 'f (args) ...;' thành 'f (arg1), f (arg2), ...;' sẽ làm việc ... – gnzlbg

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