Ví dụ đơn giản nhất tôi có thể nghĩ ra:
std::optional<int> try_parse_int(std::string s)
{
//try to parse an int from the given string,
//and return "nothing" if you fail
}
Thay vào đó, điều tương tự có thể được thực hiện bằng một đối số tham chiếu (như trong chữ ký sau), nhưng việc sử dụng std::optional
làm cho chữ ký và cách sử dụng đẹp hơn.
bool try_parse_int(std::string s, int& i);
Một cách khác mà điều này có thể được thực hiện là đặc biệt xấu :
int* try_parse_int(std::string s); //return nullptr if fail
Điều này đòi hỏi phân bổ bộ nhớ động, lo lắng về quyền sở hữu, v.v. - luôn thích một trong hai chữ ký khác ở trên.
Một vi dụ khac:
class Contact
{
std::optional<std::string> home_phone;
std::optional<std::string> work_phone;
std::optional<std::string> mobile_phone;
};
Điều này là cực kỳ thích hợp để thay vì có một cái gì đó giống như std::unique_ptr<std::string>
cho mỗi số điện thoại! std::optional
cung cấp cho bạn dữ liệu địa phương, đó là tuyệt vời cho hiệu suất.
Một vi dụ khac:
template<typename Key, typename Value>
class Lookup
{
std::optional<Value> get(Key key);
};
Nếu tra cứu không có khóa nhất định, thì chúng ta có thể trả về "không có giá trị".
Tôi có thể sử dụng nó như thế này:
Lookup<std::string, std::string> location_lookup;
std::string location = location_lookup.get("waldo").value_or("unknown");
Một vi dụ khac:
std::vector<std::pair<std::string, double>> search(
std::string query,
std::optional<int> max_count,
std::optional<double> min_match_score);
Điều này có ý nghĩa hơn nhiều so với, có bốn chức năng quá tải mà có mọi sự kết hợp có thể có max_count
(hoặc không) và min_match_score
(hoặc không)!
Nó cũng loại bỏ các nguyền rủa "Pass -1
cho max_count
nếu bạn không muốn có một giới hạn" hoặc "Pass std::numeric_limits<double>::min()
cho min_match_score
nếu bạn không muốn có một số điểm tối thiểu"!
Một vi dụ khac:
std::optional<int> find_in_string(std::string s, std::string query);
Nếu chuỗi truy vấn không tham gia s
, tôi muốn "không int
" - không phải bất kỳ giá trị đặc biệt nào mà ai đó quyết định sử dụng cho mục đích này (-1?).
Để biết thêm ví dụ, bạn có thể xem boost::optional
tài liệu . boost::optional
và std::optional
về cơ bản sẽ giống hệt nhau về hành vi và cách sử dụng.