如何解决使用可变参数模板连接多个 std::array 对象
我需要一个函数来实现以下功能:
template<typename T,std::size_t SIZE_L,std::size_t ...SIZE_R>
std::array<T,SIZE_L> concat(const std::array<T,SIZE_R...>&);
这应该将 RHS 上所有传递的数组连接成一个数组。 SIZE_R 的总和应该与 SIZE_L 相同——如果可能的话,不需要手动指定 SIZE_L。
此数组的元素类型将始终为双精度。
解决方法
使用默认的可构造 T
,您可能会这样做 (C++17):
template<typename T,std::size_t ...Ns>
std::array<T,(... + Ns)> concat(const std::array<T,Ns>&... arrs)
{
std::array<T,(... + Ns)> res;
std::size_t offset = 0;
((std::copy(arrs.begin(),arrs.end(),res.begin() + offset),offset += arrs.size()),...);
return res;
}
,
如果需要,这里有一个版本可以处理不能默认构造的类型 (try it online):
#include <array>
#include <type_traits>
#include <utility>
#include <tuple>
namespace array_concat_helper {
template <std::size_t Idx,typename SizeSeq,typename Enable=void>
struct indices
{
static constexpr std::size_t tuple_index = 0;
static constexpr std::size_t elem_index = Idx;
};
template <std::size_t Idx,std::size_t FirstN,std::size_t ...Ns>
struct indices<Idx,std::index_sequence<FirstN,Ns...>,std::enable_if_t<(Idx >= FirstN)>>
{
static constexpr std::size_t tuple_index =
1 + indices<Idx-FirstN,std::index_sequence<Ns...>>::tuple_index;
static constexpr std::size_t elem_index =
indices<Idx-FirstN,std::index_sequence<Ns...>>::elem_index;
};
template <typename T,std::size_t ...Ns,std::size_t ...Is>
std::array<T,(... + Ns)> concat(
std::index_sequence<Is...>,const std::array<T,Ns>&... arrs)
{
auto arr_tuple = std::tie(arrs...);
return {{
std::get<indices<Is,std::index_sequence<Ns...>>::tuple_index>
(arr_tuple)
[indices<Is,std::index_sequence<Ns...>>::elem_index]...
}};
}
} // end namespace array_concat_helper
template<typename T,Ns>&... arrs)
{
return array_concat_helper::concat(
std::make_index_sequence<(... + Ns)>{},arrs...);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。