о, получилось, спасибо! Точнее, получилось через apply на прокси-лямбду, которая делает new и форвардит аргументы, но это гораздо проще, чем писать свой make_from_tuple.
template <typename T> struct MakeFromTuple : T { template <typename... T1> MakeFromTuple(std::tuple<T1...>&& params) : MakeFromTuple(std::forward<std::tuple<T1...>>(params), std::index_sequence_for<T1...>()) { } template <typename... T1, typename Tuple = std::tuple<T1...>, size_t... I> MakeFromTuple(Tuple&& params, std::index_sequence<I...>) : T(std::get<I>(std::forward<Tuple>(params))...) { } }; template<typename T, typename... T1> std::shared_ptr<T> make_shared_from_tuple(std::tuple<T1...>&& params) { return std::make_shared<MakeFromTuple<T>>(std::forward<std::tuple<T1...>>(params)); } как-то так с декоратором с делегирующим конструктором
Обсуждают сегодня