Вывести аргументы шаблона функции в операторе возврата из возвращаемого типа функции - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть функция, которая возвращает шаблон класса. В этой функции оператор return вызывает функцию шаблона, которая создает экземпляр класса шаблона. Можно ли в следующей ситуации вывести аргументы шаблона функции шаблона?

#include <utility>
#include <variant>

template <class T, class U>
auto make(T&& t) -> std::variant<T, U> {
    return std::variant<T, U>{ std::forward<T>(t) };
}

auto foo() -> std::variant<int, char> {
    return make<int, char>(42);  // return make(42); instead?
}

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Вы можете иметь make обертку, которую вы даете ей в объекте, который имеет преобразование в требуемую специализацию std::variant:

template<typename T>
struct make {
    make(T &&x) : x(x) { }
    T &x;
    template<typename... Us>
    operator std::variant<T, Us...>() {
        return std::forward<T>(x);
    }
};
template<typename T>
make(T&&) -> make<T>;
1 голос
/ 03 апреля 2020

Ближайшее, что вы можете получить, довольно ужасно (и полагается на 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 в шаблоне (поскольку шаблоны функций и наборы перегрузок не могут быть аргументами шаблона), неясно, что это добавит.

...