[C++] C++17 variant
variant๋ ์งํ๋ ๊ณต์ฉ์ฒด๋ค.
๊ธฐ์กด์ union์ ๋ฌธ์ ๊ฐ ๋ง์๋ค.
์๋ฅผ ๋ค์ด ๊ธฐ์กด์ union์ ์ธ ๋,
double ๋ฒ์ ์ผ๋ก ๊ฐ์ ๋ฃ๊ณ int ๋ฒ์ ์ผ๋ก ์ฌ์ฉ์ ํ๋ค ํด๋ ์๋ฌด๋ฐ ๋ฌธ์ ์์ด ์๋์ด ๋๋ค.
ํ์ง๋ง ์ถ๋ ฅ๊ฐ์ ๋ณด๋ฉด ์๊ฒ ์ง๋ง ๊ฐ์ด ์ ์์ ์ด์ง ์๋ค.
C์ ๊ณต์ฉ์ฒด๋ ์๋ฌด๋ฐ ํ์ ๊ฒ์ฌ๋ฅผ ์ํํ์ง ์๋๋ค. ์ด ๋๋ฌธ์ C์ ๊ณต์ฉ์ฒด๋ ํ์ -safeํ์ง ๋ชปํ๋ค๊ณ ํ๋ค.
์๋ฌดํผ ์ ๋ฐ ๋ง์ด ๊ฐ ์ถ๋ ฅ๊ฐ์ด ๋์จ ์ด์ ๋ ์๋ฌด๋ฐ ์กฐ์น ์์ด ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๋ ๋นํธ๊ฐ์ ๊ทธ๋๋ก ์ฝ์ด์๊ธฐ ๋๋ฌธ์ด๋ค. ์ ์ ํ์ ๊ณผย ์ค์ ํ์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ์์ ํ ๋ค๋ฅด๋ค. ๊ฒ๋ค๊ฐ ์๋์ธ๊ณผ ๋ฐ์ดํธ ํฌ๊ธฐ๊น์ง ๊ณ ๋ คํ๋ฉด ๊ฐ์ ๊ณ์ด์ ํ์ ์ด๋ผ๋ ๊ดด๋ฆฌ๊ฐ ๋ฐ์ํ ์๊ฐ ์๋ค.
๋ฌผ๋ก ์ด๋ฐ๊ฑธ ์ด์ฉํด์ ํธ๋ฒ์ ์ผ๋ก ์ฌ์ฉํ ์๋ ์์ง๋ง,
์ค์ ๋ก ์ด๋ฐ ์์ ์ ๊ทผ์, 99% ์ฌ์ฉ์์ ์ค์์์ ๋ฐ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์๋ ๊ฒฐํจ์ผ๋ก ์ด์ด์ง๋ค.
union์ ์ด์ฒ๋ผ ์์ ์ฑ์ ๋ฌธ์ ๊ฐ ๋ง๋ค.
๊ฒ๋ค๊ฐ ๊ธฐ์กด์ union์ ์์ฑ์/์๋ฉธ์/๊ฐ์๋ฉ์๋๊ฐ ์๋ ์ด๋ฅธ๋ฐ POD ํ์
๋ง์ ๋ฉค๋ฒ๋ก ๋ ์๊ฐ ์๋ค๋ ์ฌ๊ฐํ ๊ธฐ๋ฅ์ ๊ฒฐํจ์ด ์์๋ค.
๋ค์๋งํด C++์คํ์ผ์ ํ์
์ ์ ๋๋ก ๋ด์๋์ ์์๋ค๋ ๊ฒ์ด๋ค.
C++17์์๋ ์ด๋ฐ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ variant๋ผ๋ ๋ฉ์ง ๋ ์์ ๋ด๋์๋ค.
variant๋ ํ์
-safeํ ๊ณต์ฉ์ฒด ํ
ํ๋ฆฟ์ด๋ค.
๋น์ฐํ C++ ์คํ์ผ์ ํด๋์ค๋ ๋ฉค๋ฒ๋ก ๋ ์ ์๋ค.
๊ธฐ์กด์ ๊ณต์ฉ์ฒด์ ๋ค๋ฅธ ํน์ง์ผ๋ก, ์ด๋
์์ ๋ฐ๋์ ์ด๊ธฐํ๋ฅผ ํด์ผ๋ง ์ ๊ทผ ํ์
์ ๋ฐ๊ฟ ์๊ฐ ์๋ค.
ํด๋น ํ์
์ผ๋ก์ ์ด๊ธฐํ๋ฅผ ์ํํ์ง ์๊ณ ์ ๊ทผ์ ํ๋ค๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ค.
์๋ง ์ด๋ฐ ๋ฐฉ์์ ํตํด์ ํ์
์ฒดํน๋ ์๊ฒฉํ๊ฒ ํ๊ณ ์์ฑ์/์๋ฉธ์๋ ์จ๋จน์ ์ ์๊ฒ ํ ๊ฒ ๊ฐ๋ค.
์ผ๋จ ์๋ ์ฝ๋๋ ์์ฃผ ์ ์์ ์ผ๋ก ์๋ํ๋ ์ฝ๋๋ค.
int ํ์
์ผ๋ก ๊ฐ ๋์
ํ๋ฒ ํด์ฃผ๊ณ , ์ ๊ทผํด์ ์ถ๋ ฅํ๊ณ .
double๋ก ์ด๊ธฐํํด์ฃผ๊ณ , ์ ๊ทผํด์ ์ถ๋ ฅํ๋ค.
ํ์ง๋ง ์ด๊ธฐํ๋ฅผ ์ํํ์ง ์์ผ๋ฉด ์ด๋ ๊ฒ ์์ธ๊ฐ ๋์จ๋ค.
์ด๋ ๊ฒ
๊ทธ๋ฆฌ๊ณ ์ ์ด์ ์๋ ํ์ ์ด๋ ์ธ๋ฑ์ค๋ ๋น์ฐํ ์ปดํ์ผ๋ถํฐ๊ฐ ์ ๋๋ค.
์ํผ ๊ทธ๋ ๋ค.
์์ธํ ๊ฑด ๋ ํผ๋ฐ์ค๋ฅผ ์ฐธ์กฐ
https://en.cppreference.com/w/cpp/utility/variant
std::variant - cppreference.comstd:: variant < cpp โ | utility C++ Language Standard Library Headers Freestanding and hosted implementations Named requirements Language support library Concepts library (C++20) Diagnostics library Utilities library Strings library Containers library Iterators library Ranges library (C++20) Algorit...en.cppreference.com
