Задать вопрос
Dyikot
@Dyikot

Можно ли написать template deduction guide только для второго аргумента?

Например такой класс:
template <typename T,  typename TFactory = DefaultValueFactory<T>>
class Lazy final { /*...*/};

Следующий guide позволяет выводить все
template<std::invocable TFactory>
Lazy(TFactory&&) -> Lazy<std::invoke_result_t<TFactory>, std::decay_t<TFactory>>;

И получается так, что терпимо:
Lazy Arrow = [] { return Cursor(SDL_SYSTEM_CURSOR_ARROW); };

Но, хотелось бы указывать первый аргумент явно:
Lazy<Cursor> Arrow = [] { return Cursor(SDL_SYSTEM_CURSOR_ARROW); };

Можно ли так сделать?
  • Вопрос задан
  • 29 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
Пока получилось через функцию.

#include <utility>
#include <iostream>

class Cursor {
public:
    Cursor(int aShape) noexcept : fShape(aShape) {}
    int shape() const noexcept { return fShape; }
private:
    int fShape;
};

template <typename T, typename TFactory>
class Lazy {
public:
    Lazy(TFactory&& x) : factory(std::move(x)) {}
    Lazy(const TFactory& x) : factory(x) {}
    T operator()() const { return factory(); }
private:
    mutable TFactory factory;
};

template <typename T, typename TFactory>
inline auto lazy(TFactory&& factory)
{
    return Lazy<T, std::decay_t<TFactory>>(std::forward<TFactory>(factory));
}

int main()
{
    auto arrow = lazy<Cursor>([] { return Cursor(42); } );
    std::cout << arrow().shape() << '\n';
    return 0;
}


Может, шаблонного полиморфизма вам хватит, но я бы довольно быстро прикрутил виртуальный полиморфизм.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы