有一些问题与此主题有关:
如何制作一个常量引用元组?
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)...);
}