Ближайшее, что вы можете получить, довольно ужасно (и полагается на foo
не перегруженным):
template<class F> using return_t=…; // exercise
template<class R> using make_t=
R (&)(std::variant_alternative_t<0,R>&&);
template<auto &F>
constexpr make_t<return_t<std::remove_reference_t<decltype(F)>>>
make_for=make;
auto foo() -> std::variant<int, char> {
return make_for<foo>(42);
}
Небольшое обобщение std::variant_alternative_t
, конечно, будет возможно, но так как вы необходимо явно указать make
в шаблоне (поскольку шаблоны функций и наборы перегрузок не могут быть аргументами шаблона), неясно, что это добавит.