Здесь указано, что инструкции по выводу в C ++ 17 сделают std::make_tuple
устаревшим.Однако, как я понимаю, разница между std::make_tuple
и стандартными руководствами по вычету для std::tuple::tuple
заключается в том, что при std::reference_wrapper
, std::make_tuple
будет выводиться ссылка.
Как этот вычет может быть реализован с помощьюруководства по удержанию?Нечто подобное, но расширено до шаблона Args...
, который std::tuple::tuple
имеет:
#include <tuple>
#include <functional>
template <typename T>
struct Element {
Element(std::reference_wrapper<std::decay_t<T>> rw) : value_{rw.get()} {}
Element(T t) : value_{std::move(t)} {}
T value_;
};
template <typename T> Element(T) -> Element<T>;
template <typename T> Element(std::reference_wrapper<T>) -> Element<T&>;
template <typename T> Element(std::reference_wrapper<const T>) -> Element<const T&>;
struct A {
int i;
};
int main()
{
A a{10};
Element wa{std::ref(a)};
static_assert(std::is_lvalue_reference_v<decltype(wa.value_)>);
Element wb{A{15}};
static_assert(std::is_object_v<decltype(wb.value_)>);
}
Пример .