如何从一个值元组中生成一个左值元组引用

How to make a tuple of lvalue references from a tuple of values

本文关键字:元组 一个 引用      更新时间:2023-10-16

有一些问题与此主题有关:

如何制作一个常量引用元组?

std::make_tuple没有';t参考

但两人都没有讨论如何使来自的左值引用的元组成为值的元组。

这是我得到的:

template <typename... Args>
std::tuple<Args&...> MakeTupleRef(const std::tuple<Args...>& tuple)
{
    return std::tie(tuple); // this fails because std::tie expects a list of arguments, not a tuple.
}
int main()
{
    std::tuple<int, int> tup;
    std::tuple<int&, int&> tup2 = MakeTupleRef(tup); // the values of tup2 should refer to those in tup
    return 0;
}

据我所知,std::tie在这里是理想的,因为它生成左值引用,但它不接受元组作为输入。我该如何解决这个问题?

常见的integer_sequence技巧:

template <typename... Args, std::size_t... Is>
std::tuple<Args&...> MakeTupleRef(std::tuple<Args...>& tuple, std::index_sequence<Is...>)
{
    return std::tie(std::get<Is>(tuple)...);
}

template <typename... Args>
std::tuple<Args&...> MakeTupleRef(std::tuple<Args...>& tuple)
{
    return MakeTupleRef(tuple, std::make_index_sequence<sizeof...(Args)>());
}

如果已知元组中的类型是唯一的,那么有一个更简单的替代方案:

template <typename... Args>
std::tuple<Args&...> MakeTupleRef(std::tuple<Args...>& tuple)
{
    return std::tie(std::get<Args>(tuple)...);
}