[C++] variant
Updated:
개요
- n개의 타입들 중 하나를 보관할 수 있는 클래스
- 반드시 객체를 들고 있어야하며 초기화하지 않을 경우 첫번째 타입의 디폴트 생성자를 호출한 객체를 가짐
- monostate를 통해 아무것도 없는 상태 표현 가능
- holds_alternative 함수를 이용하여 특정 타입의 보관 유무 판단
- get_if 함수를 이용하여 특정 타입인 경우 접근 가능한 포인터 획득 가능
- visit 함수를 이용하여 보관된 타입을 몰라도 접근 가능
예제
- 코드
#include <iostream> #include <string> #include <variant> #include <vector> using namespace std; int main() { variant<monostate, int, double, string> v; v = 1; cout << get<int>(v) << endl; cout << v.index() << endl; cout << holds_alternative<int>(v) << endl; cout << holds_alternative<double>(v) << endl; cout << holds_alternative<string>(v) << endl; cout << "------ 1" << endl; v = 1.1; cout << get<double>(v) << endl; cout << v.index() << endl; cout << holds_alternative<int>(v) << endl; cout << holds_alternative<double>(v) << endl; cout << holds_alternative<string>(v) << endl; cout << "------ 2" << endl; v = "abc"; cout << get<string>(v) << endl; cout << v.index() << endl; cout << holds_alternative<int>(v) << endl; cout << holds_alternative<double>(v) << endl; cout << holds_alternative<string>(v) << endl; cout << "------ 3" << endl; if (get_if<string>(&v)) { cout << get<string>(v) << endl; } cout << "------ 4" << endl; struct Visitor { void operator()(std::monostate arg) { cout << "monostate" << endl; } void operator()(int arg) { cout << arg << endl; } void operator()(double arg) { cout << arg << endl; } void operator()(string arg) { cout << arg << endl; } }; vector<variant<monostate, int, double, string>> vv{"abc", 1, 1.1}; for (const auto &iter : vv) { visit(Visitor{}, iter); } return 0; }
- 실행 결과
1 1 1 0 0 ------ 1 1.1 2 0 1 0 ------ 2 abc 3 0 0 1 ------ 3 abc ------ 4 abc 1 1.1