首页 > 解决方案 > 是否可以通过推导指南实现整个 std::make_tuple 功能?

问题描述

这里指出 C++17 中的推导指南将std::make_tuple过时。std::make_tuple但是,据我了解,与标准推导指南之间的区别在于std::tuple::tuple,给定 a std::reference_wrapperstd::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_)>);
}

例子

标签: c++c++17stdtuple

解决方案


template<class T> struct unwrap { using type = T; };
template<class T> struct unwrap<reference_wrapper<T>> { using type = T&; };

template<class... Ts>
tuple(Ts...) -> tuple<typename unwrap<T>::type...>;

推荐阅读