Задайте себе вопрос:
Какой тип возврата std::visit
, если вы не знаете, какая часть variant
активна?
То естьвопрос, на который компилятор должен ответить.И ответ не может быть «это зависит» - вы (как, например, компилятор) должны выбрать ровно один тип во время компиляции.Вызов visit
не может возвращать различные типы во время выполнения.
Если вы хотите работать с различными типами "во время выполнения", вы должны быть в функции, настроенной на тип, с которым хотите работать.Другими словами, должны быть разными функциями (или экземплярами шаблонов функций) для обработки случаев «записать int в cout
» и «записать строку в cout
».Вы не можете сделать это в той же (не шаблонной) функции.
Простое решение здесь, таким образом, заключается в том, чтобы поместить std::cout <<
в вашу шаблонную функцию посетителя - вот в чем смысл посещения: указание того, что должно произойтив каждом случае.
Если вы хотите «использовать полученное значение, возможно, также для [некоторой] другой [цели]», тогда эта «другая цель» также должна быть частью / a посетителя.Только тогда вы можете иметь эту «другую цель» обрабатывать разные случаи одновременно (например, в шаблонной функции).В противном случае вы должны решить уже во время компиляции, какой тип будет использоваться - компилятор не собирается оставлять этот выбор открытым на более позднее время (время выполнения).