इसका सबसे सरल उदाहरण मैं सोच सकता हूं:
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
मूल रूप से व्यवहार और उपयोग के मामले में समान होगा।