본문으로 바로가기

C++17) std::any

category C++/Modern 2019. 2. 27. 21:30

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


이번엔 C++이 구분된 유형의 객체에 대한 작업을 수행할 수 있는 std::any에 대해 설명합니다.


std::any 객체는 아무 형식의 값을 담을 수 있는 객체입니다.

대신 복사 가능한 ( copyable ) 형식이여야 합니다.


식별된 형식은 다른 형식의 값을 포함할 순 있지만 형식간의 변환을 시도하진 않습니다.

즉 5는 int 타입으로 엄격하게 유지되며, 암시적으로 "5" 또는 5.0으로 변환될 수 없습니다.

형식에 대해서는 무관심하지만, 단일 값을 안전하고 일반적인 컨테이너에서 효과적으로 허용하며 모호환 변환 (암시적인 변환) 을 막아줍니다.




1
2
3
4
5
6
7
8
struct vector3d {
    double x, y, z;
};
int main() {
    std::any a = vector3d{ 1.0,2.0,3.0 };    // a == vector3d type 
    a = std::string("abc");    // a == std::basic_string, vector3d 객체는 소멸됨
    a = 1;    // a == int, std::basic_string 객체는 소멸됨
}
cs

비 멤버 any_cast 함수는 포함 된 객체에 대한 유형 안전 접근을 제공합니다.

1
2
3
4
template<class ValueType>
const ValueType* any_cast(const any* operand) noexcept;
template<class ValueType>
ValueType* any_cast(any* operand) noexcept;
cs

만약 oprand.type() != typeid(remove_reference_t<valuetype>) 일 경우, bad_any_cast 형식의 예외를 던집니다.

1
2
3
4
    a = 1;    // a == int
 
    cout << std::any_cast<int>(a) << endl;    // 1
    cout << std::any_cast<double>(a) << endl// throws bad_any_cast
cs

any_cast가 pointer일때, any에 담긴 피연산자가 any_cast에 접근가능하다면 그 포인터가, 접근불가라면 nullptr을 반환합니다.

1
2
3
4
5
6
7
8
9
10
bool is_string(const any& operand) {
    return any_cast<string>(&operand) != nullptr;
}
int main() {
    std::any a("abc"s);
    std::any b(1);
 
    cout << is_string(a) << endl;    // true
    cout << is_string(b) << endl;    // false
}
cs


any 는 빈 객체로 생성될 수 있으며, optional 처럼 멤버 함수 has_value, emplace, reset, type을 가지고 있습니다.
type은 any 객체에 담긴 형식을 나타내는 type_info 객체의 참조(reference) 를 반환합니다.
빈 any 객체의 경우 type_info 는 void 입니다. ( type_info(void) )

1
2
3
4
5
6
7
    a = 1;    // a == int
 
    cout << a.type().name() << endl// int
 
    a.reset();
 
    cout << a.type().name() << endl// void
cs


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

C++20) Designated Initializer ( 지정된 초기화 )  (0) 2020.08.19
C++17) std::variant  (0) 2019.02.28
C++17) std::optional  (0) 2019.02.27
C++17) std::string_view  (0) 2019.02.26
C++17) if문과 switch문에서의 초기화  (0) 2019.02.23