Whereas std::tuple<A,B,C> is a product type, std::variant<A,B,C> is a sum type. A variant is allowed to hold either an A, a B, or a C--but never more (or less) than one of those at a time. Another name for this concept is discriminated union, because a variant behaves a lot like a native C++ union; but unlike a native union, a variant is always able to tell you which of its elements, A, B, or C, is "active" at any given time. The official name for these elements is "alternatives," since only one can be active at once:
std::variant<int, double> v1;
v1 = 1; // activate the "int" member
assert(v1.index() == 0);
assert(std::get<0>(v1) == 1);
v1 = 3.14; // activate the "double" member
assert(v1.index() == 1);
assert(std::get<1>(v1) == 3.14);
assert...