내가 생각할 수있는 가장 간단한 예는 다음과 같습니다.
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
(또는 그렇지 않은) 을 취하는 4 개의 기능 과부하를 갖는 것보다 훨씬 더 의미가 있습니다 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
"no int
"를 원합니다. 누군가가이 목적으로 사용하기로 결정한 특별한 값이 아닙니다 (-1?).
추가 예제는 boost::optional
설명서를 참조하십시오 . boost::optional
그리고 std::optional
기본적으로 행동과 사용의 측면에서 동일합니다.