由于我无法找到这样的函数(错误?),我正在尝试编写一个编译时函数(constexpr
)函数,该函数需要std::array<T,n> arr
和{{1并返回一个新的T t
std::array<T,n+1>
添加到t
的末尾。我从这样的事情开始:
arr
我陷入困境。我需要的是在初始化列表的第一个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};
}
位置展开a
,然后添加n
添加结尾的方法。那可能吗?或者还有另一种方法吗?
答案 0 :(得分:15)
当然,有可能: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>());
}