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.
- Tôi đã làm điều gì sai hoặc bỏ lỡ điều gì đó?
- Điều đó có bị cấm theo tiêu chuẩn C++ 11 không?
- 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
Bạn đã thử '[=]' thay thế? –
@Kerrek SB gợi ý tốt, nhưng nó không hoạt động hoặc –
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. –