ตัวอย่างที่ง่ายที่สุดที่ฉันนึกได้:
std::optional<int> try_parse_int(std::string s)
{
//try to parse an int from the given string,
//and return "nothing" if you fail
}
สิ่งเดียวกันอาจทำได้โดยมีอาร์กิวเมนต์อ้างอิงแทน (เหมือนในลายเซ็นต่อไปนี้) แต่การใช้std::optional
จะทำให้ลายเซ็นและการใช้งานดีกว่า
bool try_parse_int(std::string s, int& i);
อีกวิธีหนึ่งที่สามารถทำได้คือไม่ดีโดยเฉพาะ :
int* try_parse_int(std::string s); //return nullptr if fail
สิ่งนี้ต้องมีการจัดสรรหน่วยความจำแบบไดนามิกกังวลเกี่ยวกับความเป็นเจ้าของ ฯลฯ - ต้องการหนึ่งในสองลายเซ็นด้านบน
ตัวอย่างอื่น:
class Contact
{
std::optional<std::string> home_phone;
std::optional<std::string> work_phone;
std::optional<std::string> mobile_phone;
};
นี่เป็นวิธีที่ดีกว่ามากในการใช้บางอย่างแทนstd::unique_ptr<std::string>
หมายเลขโทรศัพท์! std::optional
ให้ข้อมูลตำแหน่งที่เหมาะสำหรับประสิทธิภาพ
ตัวอย่างอื่น:
template<typename Key, typename Value>
class Lookup
{
std::optional<Value> get(Key key);
};
หากการค้นหาไม่มีคีย์บางคีย์อยู่เราสามารถส่งคืน "ไม่มีค่า" ได้
ฉันสามารถใช้มันเช่นนี้
Lookup<std::string, std::string> location_lookup;
std::string location = location_lookup.get("waldo").value_or("unknown");
ตัวอย่างอื่น:
std::vector<std::pair<std::string, double>> search(
std::string query,
std::optional<int> max_count,
std::optional<double> min_match_score);
มันสมเหตุสมผลมากกว่าพูดว่ามีฟังก์ชั่นโอเวอร์โหลดสี่ฟังก์ชั่นที่ใช้การผสมผสานที่เป็นไปได้ของmax_count
(หรือไม่) และmin_match_score
(หรือไม่)!
นอกจากนี้ยังช่วยลดสาปแช่ง "ผ่าน-1
สำหรับmax_count
ถ้าคุณไม่ต้องการขีด จำกัด" หรือ "ผ่านstd::numeric_limits<double>::min()
สำหรับmin_match_score
ถ้าคุณไม่ต้องการคะแนนขั้นต่ำ"!
ตัวอย่างอื่น:
std::optional<int> find_in_string(std::string s, std::string query);
หากสตริงการสืบค้นไม่ได้อยู่ในs
นั้นฉันต้องการ "ไม่int
" - ไม่ใช่สิ่งพิเศษที่ใครบางคนตัดสินใจที่จะใช้เพื่อจุดประสงค์นี้ (-1?)
สำหรับตัวอย่างเพิ่มเติมคุณสามารถดูที่เอกสารboost::optional
boost::optional
และstd::optional
โดยทั่วไปจะเหมือนกันในแง่ของพฤติกรรมและการใช้งาน