Язык может существовать со многими функциями C ++, который делает то, что вы хотите.
Чтобы сделать то, что вы хотите, при вызове std::visit
необходимо написать N различных реализаций остальной функции.
В каждой из этих N различных реализаций (в вашем случае 2) тип переменной будет разным.
C ++ не работает таким образом.
Единственная часть кода, которая «умножается» на вызов, - это посетитель.
int main()
{
std::variant<int, char> v{char(100)};
std::visit([&](auto && t){
std::cout << t;
}, v);
}
Я помещаю остаток тела функции в посетителя. Этот код создается один раз для каждого типа, который может храниться в посетителе.
Все, что возвращает после посещения, возвращается в тело "единственного экземпляра" вызывающей области.
По сути, [&](auto&& t)
лямбды делают то, что вы, кажется, хотите.
Теперь мы можем сделать несколько трюков, чтобы немного изменить синтаксис.
Мой любимый это:
v->*visit*[&](auto&& val) {
std::cout << val;
return [val](auto&& x) { x << val; };
}->*visit*[&](auto&& outputter) {
outputer(std::cout);
};
, где ->*visit*
использует относительно нелепое количество метапрограммирования, чтобы разрешить
Названы операторы, вызывающие посещение,
Слияние возвращаемых значений посещений в варианте.
но ни один здравомыслящий человек не напишет этот код.