Contoh paling sederhana yang dapat saya pikirkan:
std::optional<int> try_parse_int(std::string s)
{
//try to parse an int from the given string,
//and return "nothing" if you fail
}
Hal yang sama mungkin dapat diselesaikan dengan argumen referensi sebagai gantinya (seperti dalam tanda tangan berikut), tetapi menggunakan std::optional
membuat tanda tangan dan penggunaan lebih baik.
bool try_parse_int(std::string s, int& i);
Cara lain yang bisa dilakukan ini sangat buruk :
int* try_parse_int(std::string s); //return nullptr if fail
Ini membutuhkan alokasi memori yang dinamis, mengkhawatirkan kepemilikan, dll. - selalu lebih suka salah satu dari dua tanda tangan lainnya di atas.
Contoh lain:
class Contact
{
std::optional<std::string> home_phone;
std::optional<std::string> work_phone;
std::optional<std::string> mobile_phone;
};
Ini lebih disukai daripada memiliki sesuatu seperti std::unique_ptr<std::string>
untuk setiap nomor telepon! std::optional
memberi Anda lokalitas data, yang sangat bagus untuk kinerja.
Contoh lain:
template<typename Key, typename Value>
class Lookup
{
std::optional<Value> get(Key key);
};
Jika pencarian tidak memiliki kunci tertentu di dalamnya, maka kita dapat dengan mudah mengembalikan "tidak ada nilai."
Saya bisa menggunakannya seperti ini:
Lookup<std::string, std::string> location_lookup;
std::string location = location_lookup.get("waldo").value_or("unknown");
Contoh lain:
std::vector<std::pair<std::string, double>> search(
std::string query,
std::optional<int> max_count,
std::optional<double> min_match_score);
Ini jauh lebih masuk akal daripada, katakanlah, memiliki empat fungsi kelebihan yang mengambil setiap kemungkinan kombinasi max_count
(atau tidak) dan min_match_score
(atau tidak)!
Hal ini juga menghilangkan yang terkutuk "Lulus -1
untuk max_count
jika Anda tidak ingin batas" atau "Lulus std::numeric_limits<double>::min()
untuk min_match_score
jika Anda tidak ingin skor minimal"!
Contoh lain:
std::optional<int> find_in_string(std::string s, std::string query);
Jika string kueri tidak ada s
, saya ingin "tidak int
" - bukan nilai khusus apa pun yang diputuskan seseorang untuk digunakan untuk tujuan ini (-1?).
Untuk contoh tambahan, Anda dapat melihat boost::optional
dokumentasi . boost::optional
dan std::optional
pada dasarnya akan identik dalam hal perilaku dan penggunaan.