2026-09-18
visit_pair.cpp
#include <iostream>
#include <variant>
template <class... Fs>
struct overloaded : Fs... { using Fs::operator()...; };
template <class... Fs>
overloaded(Fs...) -> overloaded<Fs...>;
int main() {
std::variant<int, char> a = 3;
std::variant<int, char> b = 'A';
int result = std::visit(overloaded{
[](int x, int y) { return x + y; },
[](int x, char y) { return x * y; },
[](char x, int y) { return x - y; },
[](char x, char y) { return x + y; },
}, a, b);
std::cout << result << '\n';
}
std::visitにはaとbの2つのvariantを渡しています。これは何を出力するでしょうか?
Answer
195(その後に改行)。std::visitは1つのvariantだけでなく、複数のvariantを同時に渡すこともできます。この場合、aとbそれぞれが実際に保持している型の組み合わせに対して、その組に一致するoperator()が呼ばれます。aはint(3)、bはchar('A'、値は65)を保持しているので、(int, char)のオーバーロードであるx * yが選ばれ、3 * 65 = 195になります。4通りの型の組み合わせそれぞれに別のオーバーロードを用意している点が、switch文では自然に書けない、std::visitらしい分岐です。