Tôi đang cố gắng viết một hàm như std::for_each
, ngoài việc sử dụng thông thường, cũng có thể mất std::function<bool (param)>
. Giá trị trả về false có nghĩa là tôi muốn thoát khỏi vòng lặp. Mã dưới đây là những gì tôi đã nhận được cho đến nay.tham số lambda với giá trị trả về tùy chọn
Cuộc gọi thứ hai tới a.visit([&](int) -> void)
không biên dịch khi đánh giá! Khách truy cập (i). Có thể làm công việc này hay tôi đang sủa cây sai?
Tôi đang sử dụng MSVC 2010 nhưng muốn mã nói chung tương thích với C++ 11.
#include <list>
#include <string>
#include <iostream>
struct A
{
std::list<int> _lst;
template<typename _F>
void visit(_F visitor)
{
for(std::list<int>::const_iterator it = _lst.begin(), end = _lst.end() ; it != end ; it++) {
int i = *it;
if (std::is_void<decltype(visitor(i))>::value) {
visitor(i);
} else {
if (!visitor(i)) { // <----- error C2171: '!' : illegal on operands of type 'void'
break;
}
}
}
}
};
int main(int argc, char* argv[])
{
A a;
// populate a
for (int i = 0 ; i < 10 ; i++) {
a._lst.push_back(i);
}
a.visit([](int i) -> bool {
std::cout << i << std::endl;
return i < 5;
});
a.visit([](int i) {
std::cout << i << std::endl;
});
}
Mã trên cả hai mặt của nhánh nếu cần phải chính xác và có thể biên dịch, vì vậy bạn không thể chọn dựa trên std :: is_void bên trong phần thân hàm. – goji
Tại sao bạn sử dụng tên bắt đầu bằng dấu gạch dưới và một chữ cái viết hoa như '_F'? –
Đó là quy ước tôi sử dụng cho các tham số mẫu. Tôi nghĩ tôi đã nhặt nó từ khi nhìn vào mã STL. – kylewm