본문으로 바로가기

C++17) std::optional

category C++/Modern 2019. 2. 27. 03:11

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4562.html#optional


이번엔 선택적 객체를 나타내는 클래스 템플릿 std::optional 에 대해 설명합니다.

std::optional 은 monad 에서 영감을 받아 만들어진 클래스입니다.


주어진 시간에 optional<T>는 인스턴스 값을 포함하거나, 포함하지 않아도 됩니다.

만약 값이 포함되면, T타입의 객체는 optional의 저장 공간 내에 할당 되며 동적 메모리와 같은 추가 저장소는 사용하지 않습니다.

포함된 값은 T에 맞게 적절하게 정렬된 optional<T> 저장 영역에 할당 됩니다. ( 배열을 말하는 듯...? )

optional<T> 유형의 객체가 bool 로 변환될 수 있는데, 값이 있다면 true 없다면 false를 반환합니다.


optional<T> 객체가 값을 포함하면, 참조된 값은 optional<T> 안에 포함된 값을 나타냅니다. ( *optional<T> = 안의 값 )


T는 객체 유형이어야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <typename T, typename U>
std::optional<std::tuple<T,U>> monad(const T& rhs1, const U& rhs2) {
    if (rhs1 != NULL && rhs2 != NULL) {
        return std::tuple<T, U>(rhs1, rhs2);
    }
    return {};
}
 
 
int main()
{
    if (auto op1 = monad(1,3.5); op1.has_value()) {
        cout << std::get<0>(*op1) << endl;
        cout << std::get<1>(*op1) << endl;
    }
}
cs

has_value() 함수는 bool 형식을 반환합니다.
만약 값이 있을 경우 true, 없을 경우 false 입니다.

std::optional<T>에는 const T&& 값을 받는 생성자가 있습니다. 
고로 std::tuple<T,U>를 리턴하면, std::optional<std::tuple<T,U>> 값을 자동으로 리턴합니다.

만약 값을 찾지못한다면 std::optional은 빈 객체를 리턴하게 되는데, 이때 자료값은 생성되지 않습니다.

1
2
3
    std::optional<std::tuple<int,double>> op1 = monad(00.0).value_or(std::tuple<intdouble>(102.5));
    cout << std::get<0>(*op1) << endl; //10
    cout << std::get<1>(*op1) << endl; //2.5
cs

value_or 함수는 만약 반환받은 std::optional 의 값이 '비어있을 경우' 우측의 값으로 변환됩니다.
위는 monad에서 빈 optional 값이 반환됐고, 그 값을 std::optional<std::tuple<int,double>(10,2.5) 값으로 변환시킨겁니다.
만약 호출에 실패할 경우 미리 지정된 값을 사용된다고 보시면 이해가 되실 것 같습니다.


'C++ > Modern' 카테고리의 다른 글

C++17) std::variant  (0) 2019.02.28
C++17) std::any  (0) 2019.02.27
C++17) std::string_view  (0) 2019.02.26
C++17) if문과 switch문에서의 초기화  (0) 2019.02.23
C++14) 자료형을 통한 튜플 어드레싱 ( Tuple addressing by type )  (0) 2019.02.22