2013-06-05 17 views
13

Giả sử một phương thức trả về một cái gì đó như thế nàylấy một đối tượng từ tăng :: tùy chọn

boost::optional<SomeClass> SomeMethod() 
{...} 

Bây giờ giả sử tôi có một cái gì đó như thế này

boost::optional<SomeClass> val = SomeMethod(); 

Bây giờ câu hỏi của tôi là làm thế nào tôi có thể trích xuất ra khỏi SomeClass val?

Vì vậy mà tôi có thể làm một cái gì đó như thế này:

SomeClass sc = val ? 

Trả lời

19

Bạn có thể sử dụng toán tử de-tham khảo:

SomeClass sc = *val; 

Ngoài ra, bạn có thể sử dụng get() phương pháp:

SomeClass sc = val.get(); 

Cả hai đều trả về tham chiếu lvalue cho sốcơ bản Đối tượng.

7

Để kiểm tra xem tùy chọn chứa một giá trị, và các tùy chọn lấy nó:

boost::optional<SomeClass> x = SomeMethod(); 
if (x) 
    x.get(); 

Để có được giá trị tùy chọn, hoặc một giá trị mặc định nếu nó không tồn tại:

SomeMethod().get_value_or(/*default value*/) 
3

Như được đề cập trong các câu trả lời trước, toán tử de-reference và hàm get() có cùng chức năng. Cả hai yêu cầu tùy chọn để chứa dữ liệu hợp lệ.

if (val) 
{ 
    // the optional must be valid before it can be accessed 
    SomeClass sc1 = *val; 
    SomeClass sc2 = val.get(); 
} 

Thay thế là chức năng value(), điều này sẽ ném ngoại lệ nếu tùy chọn không mang giá trị.

// throws if val is invalid 
SomeClass sc3 = val.value(); 

Ngoài ra, các chức năng value_orvalue_or_eval thể được sử dụng để xác định giá trị mặc định được trả lại trong trường hợp giá trị không được thiết lập.