본문 바로가기

프로그래밍

내가 기대하는 C++17 - std::optional

 

 위와 같이 아이템의 슬롯 인덱스로 해당 아이템을 찾는 기능을 수행하는 일은 빈번하다. 동작이 실패할 수 있는 함수를 호출할 때, 반환 타입이 Nullable하다면 (InventoryItem*) nullptr를 반환하면 된다.

 그러나 반환값이 Value 타입이라면? 

  1.  위와 같이 함수 수행의 결과물인 bool 값을 반환하고, 실제 반환값인 item은 참조 파라미터로 받아야만 한다.

  2.  Pair<bool, InventoryItem> 객체로 해당 함수 실행 결과물의 유효성을 반환한다.

  3.  반환값의 대상이 되는 객체가 스스로 Valid 하지 않음을 알려주는 함수를 지원하여 Nullptr 검사와 같이 isValid 함수를 콜하도록 한다.

 std::optional은 이런 경우를 더 우아하게 처리할 수 있도록 도와준다.

 위의 코드는 아래와 같이 쓸 수 있다.

 

 

std::optional<InventoryItem> 형태로 받은 반환 값 item은 if (item.has_value())나 if (item) 과 같이 유효성을 확인할 수 있다.

해당 값을 반환하는 쪽에서는 그냥 InventoryItem 타입으로 반환하기만 하면 optional<T>가 const T&&를 받는 생성자로 초기화 하여 값을 전달한다. 그렇지 않은 경우에는 return {}으로 빈 optional 객체를 반환하면 된다.

 

optional은 아래와 같은 경우에도 사용할 수 있다.

 

 인자가 들어올 수도 있고 아닐 수도 있는 경우, default 값을 설정하여 해당 default 값이면 들어오지 않았다고 판단하는 경우가 있는데, 이런 경우에도 optional을 사용하여 명시적으로 의미를 전달할 수 있다.