附加到 std::array
Posted
技术标签:
【中文标题】附加到 std::array【英文标题】:Append to std::array 【发布时间】:2016-12-30 15:39:24 【问题描述】:由于我找不到这样的函数(不正确?),我正在尝试创建一个编译时函数 (constexpr
) 函数,它采用 std::array<T,n> arr
和 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;
我在这里卡住了。我需要的是一种在初始化列表的第一个 n
位置扩展 a
的方法,然后添加 t
添加末尾。那可能吗?或者有其他方法吗?
【问题讨论】:
【参考方案1】:当然有可能: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>());
【讨论】:
哇,对我来说简直是魔法!近年来,C++ 确实取得了长足的进步。谢谢! 值得补充的是,对于 c++11,integer_sequence
有可用的有效实现,例如this one 不幸的是它不是开箱即用的。
@kalj:实际上,并没有什么魔力。也许这对我来说很自然,因为我发布了this answer,这导致了相关的proposal。 ;-)
@DietmarKühl,如果这很神奇,那么答案对我来说就是纯粹的巫术。不过有很多很酷的东西要学!
好的,稍作修改即可使用。结果N
必须是std::size_t
,还有一个小错字,append 应该返回一个大小为N+1
的数组。您可能需要更新此内容。【参考方案2】:
很容易将 Dietmar 的答案扩展到一个可以让您对两个数组进行 constexprcatenate 的工具:
// 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>());
【讨论】:
以上是关于附加到 std::array的主要内容,如果未能解决你的问题,请参考以下文章