Это просто не то, как std::visit
указано:
template <class Visitor, class... Variants>
constexpr /*see below*/ visit(Visitor&& vis, Variants&&... vars);
Требуется пакет параметров variant
с.Это не займет tuple
из них, хотя это очень похожие вещи.И когда вы visit
несколько variant
с, ваши вызовы функций вызываются с несколькими аргументами, а не tuple
из них.
Чтобы использовать стандартный механизм, вы хотите:
std::visit(overloaded{
[](A const&, A const&) {}, // <== unpack all of these
[](B const&, B const&) {},
[](C const&, C const&) {},
[](auto const&, auto const&) {},
}, std::get<0>(var_pair), std::get<1>(var_pair)); // <== unpack this too
Если вы предпочитаете работать в tuple
s, вы можете написать свою собственную версию visit
, которая распаковывает variant
s и перепаковывает элементы:
template <typename F, typename Tuple>
decltype(auto) visit_tuple(F f, Tuple t) {
return std::apply([=](auto... vs){ // <== unpack the variants
return std::visit([=](auto... elems){
return f(std::tuple(elems...)); // <== repack the alternatives
}, vs...);
}, t);
}
Правильная обработка и пересылка ссылокоставил как упражнение.