이전에 나는 question에 대해 std::variant
이라고 물었다. 변형에 의해 보유 된 유형이 모두 std::cout
에 의해 인쇄 가능한 것을 고려하면 방문자를 구현하는 간단한 방법이 있습니까?템플릿이 std :: variant의 방문을 위해 작동합니까?
Here 예를 들어, 모든 유형의 모든 람다를 처리 할 수 있지만 모두 동일한 작업을 수행합니다 (std::string
제외) : std::cout << arg << ' ';
. 내 자신을 반복하지 않는 방법이 있습니까?
std::visit(overloaded {
[](int arg) { std::cout << arg; },
[](long arg) { std::cout << arg; },
[](double arg) { std::cout << arg; }
// I removed the std::string case
}, v); // v is the std::variant
대신 쓰기 :
std::visit( [](auto arg) { std::cout << arg; }, v);
또는 뭔가 같은 :
template<typename T>
void printer(T arg) {std::cout << arg; }
//.......
std::visit(printer, v);
두 번째 블록 (일반 람다 포함)이 작동해야합니다. 템플릿이 단일 함수 또는 객체가 아니기 때문에 세 번째 블록 (템플릿 함수 사용)은 작동하지 않습니다. 당신은 템플릿'operator()'로 당신 자신의 callable을 작성할 수 있습니다 : struct printer {template void operator() (T arg) {std :: cout << arg; }}; std :: visit (printer {}, v);'(일반적인 람다와 대략 동일합니다). –
질문에 [tag : C++] 태그를 계속 추가 할 때 이유가 있습니다. 앞으로도 직접하십시오. –