2010-10-31 31 views
5

Tôi vừa mới viết lại mã C89 sau, trả về từ hàm hiện tại:Return từ một lambda gọi C++ 0x trực tiếp

// make sure the inode isn't open 
{ 
    size_t i; 
    for (i = 0; i < ARRAY_LEN(g_cpfs->htab); ++i) 
    { 
     struct Handle const *const handle = &g_cpfs->htab[i]; 
     if (handle_valid(handle)) 
     { 
      if (handle->ino == (*inode)->ino) 
      { 
       log_info("Inode "INO_FMT" is still open, delaying removal.", 
         (*inode)->ino); 
       return true; 
      } 
     } 
    } 
} 

Với C++ 0x STL/lambda lai:

std::for_each(g_cpfs->htab.begin(), g_cpfs->htab.end(), [inode](Handle const &handle) { 
    if (handle.valid()) { 
     if (handle.ino == inode->ino) { 
      log_info("Inode "INO_FMT" is still open, delaying removal.", inode->ino); 
      return true; 
     } 
    }}); 

nào tạo:

1> e: \ src \ cpfs4 \ libcpfs \ inode.cc (128): lỗi C3499: a lambda đã được xác định để có một kiểu void trở lại không thể trở về av alue

Tôi đã không nghĩ rằng sự trở lại trong lambda, không thực sự trở về từ người gọi (chưa bao giờ thấy chức năng phạm vi trong C/C++ trước đây). Làm cách nào để tôi return true từ người gọi có chức năng gốc đã làm như vậy?

Trả lời

6

Bạn không; std :: for_each không có cấu trúc để xử lý sự trở lại sớm. Bạn có thể ném một ngoại lệ ...

Hoặc không sử dụng một lambda:

for (auto const &handle : g_cpfs->htab) { 
    // code that was in lambda body 
} 
+0

Note "phạm vi có trụ sở tại vòng" (tùy theo từng 0x dự thảo gọi chúng) là "vòng lặp foreach", đó là những gì bạn đang cố gắng để có được từ std :: for_each. –

+0

Cú pháp foreach chính xác là những gì tôi đang tìm kiếm. –

+0

vâng, tôi đã xóa lại nhận xét đó. Tôi cho rằng anh ta có nghĩa là cú pháp 'for_each'. :) – jalf

2

Sử dụng std::find_if() thay vì std::for_each():

if (std::find_if(g_cpfs->htab.begin(), g_cpfs->htab.end(), 
     [inode](Handle const &handle) { 
      if (handle.valid() && handle.ino == inode->ino) { 
       log_info("Inode "INO_FMT" is still open, delaying removal.", 
        inode->ino); 
       return true; 
      } 
      return false; 
     }) != g_cpfs->htab.end()) { 
    return true; 
} 
+0

Trong khi find_if không hoạt động tại sửa chữa trở kháng không phù hợp vòng lặp, sử dụng nó với nếu và các giá trị trả về như thế cảm thấy sai. –

+0

@Roger, yup, tôi cũng phải sử dụng thụt đầu dòng khá kỳ lạ để làm cho nó dễ đọc. Nó hoạt động, tuy nhiên, vì vậy tôi không biết nếu đó thực sự là một vấn đề ... –

+0

Nó cảm thấy lạ, nhưng đây là cách tốt nhất để làm điều đó, cho rằng MSVC2010 dường như không hỗ trợ dựa trên phạm vi? –

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