2011-10-27 22 views
9

Tôi có một hàm cần trả về NULL trong một số trường hợp và có một hàm khác cần kiểm tra cho giá trị trả về của hàm này. Tôi nhận thức được tăng :: tùy chọn nhưng tôi không biết cách sử dụng cú pháp.Làm thế nào để sử dụng tăng :: tùy chọn <T> để trả về NULL trong C++?

Dưới đây sẽ là một ví dụ đơn giản của việc sử dụng nói:

int funct1(const string& key) { 
    // use iterator to look for key in a map 
    if(iterator == map.end()) { 
    return NULL // need help here! 
    else 
    return it->second; 
} 

void funct2(string key) { 
    if(funct1(key) == NULL) { // <-- need help here! 
    // do something 
    } else { 
    // do something else 
    } 

Ai đó có thể xin vui lòng giúp với cú pháp?

Cảm ơn.

+9

Bạn đã hỏi 10 câu hỏi và chấp nhận 0 câu trả lời. Bạn nên quay lại và chấp nhận câu trả lời đúng. –

Trả lời

14

Nó nằm trong trạng thái "NULL" cho đến khi bạn đặt. Bạn có thể sử dụng thành ngữ này:

optional<int> funct1(const string& key) { 
    // use iterator to look for key in a map 
    optional<int> ret; 
    if (iterator != map.end()) 
    { 
    ret = it->second; 
    } 

    return ret; 
} 

Sau đó:

if (!funct1(key)) { /* no value */ } 
1

Hãy thử điều này:

int funct1(const string& key) 
{ 
    // use iterator to look for key in a map 
    if(iterator == map.end()) 
    return boost::optional<int>(); 
    else 
    return boost::optional<int>(it->second); 
} 

void funct2(string key) 
{ 
    const boost::optional<int> result = funct1(key); 
    if (result.is_initialized()) 
    { 
    // Value exists (use result.get() to access it) 
    } 
    else 
    { 
    // Value doesn't exist 
    } 
} 

Tôi cũng xin typedef mẫu, để làm cho mọi việc dễ dàng hơn:

typedef boost::optional<int> OptionalInt; 
+5

Tài liệu Boost.Optional nói rằng 'is_initialized' không được dùng nữa; thay vào đó hãy sử dụng toán tử chuyển đổi 'bool' (ví dụ:' if (result) {...} '). Ngoài ra, kiểu trả về 'funct1' của bạn không được là' int'. – ildjarn

3

Hãy để tôi đề cập đến một vài điều trước khi tôi đến estion.

Nếu chuỗi luôn luôn được tìm thấy (lỗi lập trình nếu không có), bạn có lẽ nên ném nếu không thể thay vì sử dụng tùy chọn. Bạn thậm chí có thể muốn thử/nắm bắt/ném ngay cả khi đó là đầu vào của người dùng.

Nếu lớp học của bạn bắt chước vùng chứa như ngữ nghĩa, bạn nên cân nhắc sử dụng mã bưu chính end để cho biết rằng nó không được tìm thấy, không phải là rỗng.

Nếu tuy nhiên trả về biểu diễn rỗng là những gì bạn đang theo dõi, kiểu trả về hàm của bạn sẽ là boost::optional<int> và trả lại không là return boost::none;.

+1

Hi Mark B. - Tại sao bạn đề nghị trả lại tăng :: không trong khi những người khác thích chỉ trả lại tùy chọn? Có sự khác biệt nào không? Nếu có, cái nào được ưu tiên trong cài đặt mã chuyên nghiệp? Mã của tôi được dự định là một thư viện mà người dùng khác có thể sử dụng, vì vậy, hãy thử/catch/throw được ưa thích hơn trong mã dựa nhiều vào đầu vào của người dùng? Cảm ơn. – czchlong

+0

Tôi cũng khuyên bạn nên sử dụng 'boost :: none', vì nó làm tăng khả năng đọc (theo ý kiến ​​của tôi). –

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