0Pricing
C++ Academy · 강의

std::visit

variant 대안 처리하기

std::visit은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

왜 std::visit을 사용할까요

각 대안을 get_if로 직접 확인하면 코드가 장황해집니다. std::visit은 변형 객체가 현재 보유한 타입에 호출 가능한 객체를 적용하고, 호출 대상 선택을 대신 처리합니다.

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double> v = 4;
    std::visit([](auto x){ std::cout << x << "\n"; }, v);
}

일반 람다 방문자

람다가 auto를 매개변수로 받고 본문이 모든 대안에 대해 컴파일된다면 모든 대안에서 작동합니다. 여기서는 활성 상태인 타입을 무엇이든 출력합니다.

#include <iostream>
#include <string>
#include <variant>
int main() {
    std::variant<int, std::string> v = std::string("hi");
    std::visit([](const auto& x){ std::cout << x << "\n"; }, v);
}

값 반환하기

std::visit은 값을 반환할 수도 있습니다. 모든 분기에서 같은 타입을 반환해야 합니다.

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double> v = 2.5;
    double d = std::visit([](auto x){ return x * 2.0; }, v);
    std::cout << d << "\n";
}

if constexpr를 사용한 타입별 동작

하나의 일반 람다 안에서 타입마다 다르게 동작하려면 if constexpr를 std::decay_t 및 std::is_same_v와 함께 사용하십시오.

#include <iostream>
#include <string>
#include <variant>
#include <type_traits>
int main() {
    std::variant<int, std::string> v = 5;
    std::visit([](const auto& x){
        using T = std::decay_t<decltype(x)>;
        if constexpr (std::is_same_v<T, int>) std::cout << "int " << x << "\n";
        else std::cout << "str " << x << "\n";
    }, v);
}

구조체 방문자

타입마다 하나씩 여러 operator() 오버로드를 가진 구조체를 작성할 수도 있습니다. 컴파일러가 일치하는 오버로드를 선택합니다.

#include <iostream>
#include <string>
#include <variant>
struct Printer {
    void operator()(int i) const { std::cout << "int " << i << "\n"; }
    void operator()(const std::string& s) const { std::cout << "str " << s << "\n"; }
};
int main() {
    std::variant<int, std::string> v = std::string("yo");
    std::visit(Printer{}, v);
}

overloaded 관용구

널리 사용되는 도우미는 여러 람다를 하나의 방문자로 결합합니다. 각 람다가 특정 타입을 처리합니다.

#include <iostream>
#include <string>
#include <variant>
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
int main() {
    std::variant<int, std::string> v = 8;
    std::visit(overloaded{
        [](int i){ std::cout << "i=" << i << "\n"; },
        [](const std::string& s){ std::cout << "s=" << s << "\n"; }
    }, v);
}

모든 경우 처리

방문자는 모든 대안을 처리해야 하며, 그렇지 않으면 코드가 컴파일되지 않습니다. 이 컴파일 시점 검사가 특정 경우를 빠뜨리는 일을 방지합니다.

방문하며 변경하기

변형 객체를 const가 아닌 참조로 전달하면 방문자가 저장된 값을 그 자리에서 변경할 수 있습니다.

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double> v = 10;
    std::visit([](auto& x){ x += 1; }, v);
    std::cout << std::get<int>(v) << "\n";
}

여러 변형 객체

std::visit은 한 번에 여러 변형 객체를 받을 수 있으며, 이때 방문자는 변형 객체마다 하나씩 인수를 받습니다.

#include <iostream>
#include <variant>
int main() {
    std::variant<int, double> a = 2;
    std::variant<int, double> b = 3.0;
    auto sum = std::visit([](auto x, auto y){ return x + y; }, a, b);
    std::cout << sum << "\n";
}

방문자 방식 선택하기

일관된 처리를 위해 일반적인 auto 람다를 사용하고, 깔끔한 타입별 로직을 위해 overloaded 관용구를 사용하며, 여러 호출 위치에서 동작을 재사용하려면 구조체 방문자를 사용하십시오.

Visit과 get_if 비교

한 번 빠르게 확인할 때는 get_if도 괜찮지만, std::visit은 모든 경우를 처리하도록 강제하고 타입별 로직을 한곳에 모으므로 규모를 키우기 좋습니다.

빠른 확인

std::visit에 대한 이해를 확인해 보십시오.

복습

std::visit에 대해 다음을 배웠습니다:

  • 호출 가능한 객체를 활성 대안에 전달합니다.
  • 일반 람다, if constexpr, 구조체 방문자 또는 overloaded 관용구를 사용합니다.
  • 방문자는 모든 경우를 처리해야 합니다(컴파일 시점 검사).
  • 값을 반환할 수 있으며 여러 변형 객체를 함께 방문할 수 있습니다.

자주 묻는 질문

“std::visit” 강의는 무료인가요?

네 — “std::visit” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“std::visit”에서 뭘 배우나요?

variant 대안 처리하기 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C++ Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“std::visit” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 스코프가 지정된 enum class
  2. 공용체와 그 위험성
  3. std::variant
  4. std::visit
← C++ Academy(으)로 돌아가기