【发布时间】:2015-02-16 11:33:35
【问题描述】:
我正在尝试一些元组,我发现自己处于奇怪的位置,问这个问题:我如何复制两个大小不同的元组?当然,这仅限于两个元组的最小长度。
例如,让我们创建三个元组:
std::tuple<int, char, float> a(-1, 'A', 3.14);
std::tuple<int, char, double> b = a;
std::tuple<long, int, double, char> c;
现在,a 和 b 在类型上有所不同,并且分配工作(显然)。至于a 和c,事情变得更加混乱了。
我的第一个实现失败了,因为我不知道如何在具有特定类型的可变参数模板上递归,所以这样的事情不会起作用:
template <class T, class U>
void cp(std::tuple<T> from, std::tuple<U> to)
{
}
template <class T, class... ArgsFrom, class U, class... ArgsTo>
void cp(std::tuple<T, ArgsFrom...> from, std::tuple<U, ArgsTo...> to)
{
std::get<0>(to) = std::get<0>(from);
// And how to generate the rest of the tuples?
}
那个函数不会做任何事情。所以我设计了第二次 failing 尝试,不是使用类型,而是使用大小:
template<class From, class To, std::size_t i>
void copy_tuple_implementation(From &from, To &to)
{
std::get<i>(to) = std::get<i>(from);
copy_tuple_implementation<From, To, i - 1>(from, to);
}
template<>
void copy_tuple_implementation<class From, class To, 0>(From &from, To &to)
{
}
template<class From, class To>
void copy_tuple(From &from, To &to)
{
constexpr std::size_t from_len = std::tuple_size<From>::value;
constexpr std::size_t to_len = std::tuple_size<To>::value;
copy_tuple_implementation<From, To, from_len < to_len ? from_len - 1 : to_len - 1>(from, to);
}
但这不会编译。我有太多错误无法在此处显示,但最重要的是:
Static_assert failed "tuple_element index out of range"
No type named 'type' in 'std::__1::tuple_element<18446744073709551612, std::__1::__tuple_types<> >'
Read-only variable is not assignable
No viable conversion from 'const base' (aka 'const __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, int, int, double>') to 'const __tuple_leaf<18446744073709551615UL, type>'
有趣的部分是索引超出范围,我无法复制带有std::get<> 的元素。
谁能帮我解决这个问题?
谢谢!
【问题讨论】:
-
谷歌搜索“c++ 索引技巧”。
标签: c++ templates c++11 tuples