Append to std::array

Append to std::array

本文关键字:array std to Append      更新时间:2023-10-16

由于我无法找到这样的函数(不正确?),我正在尝试创建一个编译时函数(constexpr)函数,该函数采用std::array<T,n> arrT t并返回一个新的std::array<T,n+1>,并在arr末尾添加了t。我从这样的事情开始:

template <typename T, int n>
constexpr std::array<T,n+1> append(std::array<T,n> a, T t);
template <typename T>
constexpr std::array<T,1> append(std::array<T,0> a, T t)
{
  return std::array<T,1>{t};
}
template <typename T>
constexpr std::array<T,2> append(std::array<T,1> a, T t)
{
  return std::array<T,2>{a[0], t};
}

在这里我卡住了。我需要的是一种在初始值设定项列表的前 n 位展开a的方法,然后添加t添加结尾。这可能吗?还是有另一种方法可以做到这一点?

当然,有可能:std::index_sequence<I...>是你的朋友!您只需调度到一个函数,该函数将合适的std::index_sequence<I...>作为参数,并使用所有值扩展包。例如:

template <typename T, std::size_t N, std::size_t... I>
constexpr std::array<T, N + 1>
append_aux(std::array<T, N> a, T t, std::index_sequence<I...>) {
    return std::array<T, N + 1>{ a[I]..., t };
}
template <typename T, std::size_t N>
constexpr std::array<T, N + 1> append(std::array<T, N> a, T t) {
    return append_aux(a, t, std::make_index_sequence<N>());
}
很容易

将 Dietmar 的答案扩展到一个实用程序,该实用程序允许您连接两个数组:

// constexpr util to catenate two array's.
//
// Usage:
//
// constexpr std::array<int, 2> a1 = { 1, 2 };
// constexpr std::array<int, 2> a2 = { 3, 4 };
//
// constexpr auto a3 = catenate_array(a1, a2);
template <typename T, std::size_t N, std::size_t M, std::size_t... I, std::size_t... J>
constexpr std::array<T, N + M>
catenate_array_aux(std::array<T, N> a1, std::array<T, M> a2, std::index_sequence<I...>, std::index_sequence<J...>) {
    return std::array<T, N + M>{ a1[I]..., a2[J]... };
}
template <typename T, std::size_t N, std::size_t M>
constexpr std::array<T, N + M> catenate_array(std::array<T, N> a1, std::array<T, M> a2) {
    return catenate_array_aux(a1, a2, std::make_index_sequence<N>(), std::make_index_sequence<M>());
}