c++ - 复制两个不同大小的元组

标签 c++ templates c++11 tuples

我正在试验一些元组,我发现自己在问这个问题时处于奇怪的位置:如何复制两个大小不同的元组?当然,这是为了限制两个元组的最小长度。

例如,让我们创建三个元组:

std::tuple<int, char, float> a(-1, 'A', 3.14);

std::tuple<int, char, double> b = a;

std::tuple<long, int, double, char> c;

现在,ab类型和分配工作(显然)不同。至于ac事情变得更加困惑了。

我的第一个实现失败了,因为我不知道如何递归具有特定类型的可变参数模板,所以像这样的东西是行不通的:

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? 
}

该函数不会执行任何操作。所以我设计了第二次失败尝试,不使用类型,而是使用大小:

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++14 的现成整数序列模板(但如果您的库不包含它,这很容易手动复制):

#include <tuple>
#include <utility>

template <std::size_t ...I, typename T1, typename T2>
void copy_tuple_impl(T1 const & from, T2 & to, std::index_sequence<I...>)
{
    int dummy[] = { (std::get<I>(to) = std::get<I>(from), 0)... };
    static_cast<void>(dummy);
}

template <typename T1, typename T2>
void copy_tuple(T1 const & from, T2 & to)
{
    copy_tuple_impl(
        from, to,
        std::make_index_sequence<std::tuple_size<T1>::value>());
}

例子:

#include <iostream>

int main()
{
    std::tuple<int, char> from { 1, 'x' };
    std::tuple<int, char, bool> to;
    copy_tuple(from, to);
    std::cout << "to<0> = " << std::get<0>(to) << "\n";
}

关于c++ - 复制两个不同大小的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28540518/

相关文章:

C++参数包展开失败

android - 如何安装 glibc 为 android 编译 perf

javascript - 如何在 Google Apps 脚本中使用 google.script.run 将 JS 对象传递给服务器函数?

C++ 转换问题

c++ - 如何在 IntelliJ IDEA 中使用 C++?

c++ - std::forward 和 operator()

c++ - 如何在 Boost.MPL 中使用嵌套元函数?

c++ - <c____> 头文件中声明的 C 函数是否保证在全局命名空间和 std 中?

c++ - vector 、字符串还是数组?

templates - D 类型推断取决于模板参数的顺序