c++ - 如何从 T 的数组创建 N T 的元组?

标签 c++ arrays tuples c++14

如果我有一个 constexpr N 的数组整数,如何将其转换为适当的 constexpr std::tuple<...>

最佳答案

这是原始数组的可能实现:

#include<functional>

template<std::size_t... I, std::size_t N>
constexpr auto f(const int (&arr)[N], std::index_sequence<I...>) {
    return std::make_tuple(arr[I]...);
}

template<std::size_t N>
constexpr auto f(const int (&arr)[N]) {
    return f(arr, std::make_index_sequence<N>{});
}

int main() {
    constexpr int arr[] = { 0, 1, 2 };
    constexpr auto tup = f(arr);
    static_assert(std::get<0>(tup) == 0, "!");
    static_assert(std::get<1>(tup) == 1, "!");
    static_assert(std::get<2>(tup) == 2, "!");
}

constexpr 数组的大小可以在编译时推导出来,因此您不必显式指定它。
该大小可在内部用于创建一组索引以从数组中取出元素并动态创建元组。


正如评论中提到的,如果你想更概括一点并接受原始数组和 std::arrays,你可以这样做:

#include<functional>
#include<array>

template<std::size_t... I, typename U>
constexpr auto f(const U &arr, std::index_sequence<I...>) {
    return std::make_tuple(arr[I]...);
}

template<typename T, std::size_t N>
constexpr auto f(const T (&arr)[N]) {
    return f(arr, std::make_index_sequence<N>{});
}

template<typename T, std::size_t N>
constexpr auto f(const std::array<T, N> &arr) {
    return f(arr, std::make_index_sequence<N>{});
}

int main() {
    constexpr int arr1[] = { 0, 1, 2 };
    constexpr auto tup1 = f(arr1);
    static_assert(std::get<0>(tup1) == 0, "!");
    static_assert(std::get<1>(tup1) == 1, "!");
    static_assert(std::get<2>(tup1) == 2, "!");

    constexpr std::array<int, 3> arr2 = { 0, 1, 2 };
    constexpr auto tup2 = f(arr2);
    static_assert(std::get<0>(tup2) == 0, "!");
    static_assert(std::get<1>(tup2) == 1, "!");
    static_assert(std::get<2>(tup2) == 2, "!");
}

关于c++ - 如何从 T 的数组创建 N T 的元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41207774/

相关文章:

c++ - 使用从 mkstemp 生成的文件名

php - 防止数组覆盖,而是创建新的数组索引

c++ - 对每个元组元素应用多态函数的结果类型

f# - fsharp 中的 fst 和 3 元组

c++ - 使用推力的 ODE 求解器的 CUDA 编程

c++ - 如何正确重载流运算符以在多态类中进行打印?

c++ - 为什么我需要一个外部变量的包含文件?

c++ - 使用 gdb 时找不到调试符号

arrays - 检查元素是否存在于 Bash 数组中

c++ - 循环通过 std::vector 从 std::string 数组中查找匹配项,更简单的方法吗?