[英]How to extend constant array in C++ using a base array
在 C++ 中,是否可以将常量数组声明为较小常量数组的扩展?
例如,如果我有以下数组:
const uint32 oid_base[] = {1,3,6,1,4,1,72000};
const uint32 oid_complete[] = {1,3,6,1,4,1,72000,1,1};
是否有申报方式oid_complete
使用oid_base
在声明oid_complete
?
我的猜测是这在 C++ 中是不可能的,但想知道是否有人对此有很好的解决方案。
这不是gsl::span
的用途吗?
const uint32_t oid_complete_data[] = {1,3,6,1,4,1,72000,1,1};
const gsl::span<const uint32_t> oid_complete{
oid_complete_data,
sizeof(oid_complete_data)};
const gsl::span<const uint32_t> oid_base{
oid_complete_data,
sizeof(oid_complete_data)-2};
使用 for 循环很容易做到这一点,但这要求元素类型是可默认构造的。 不确定您是否可以在 constexpr C++20 中按元素构造 la std::vector ...
无论如何,您始终可以使用索引序列。 请不要使用宏。 顺便说一下,我很确定在某个地方有一个重复的问题,可能有更优雅和更一般的答案。
#include <array>
#include <iostream>
#include <utility>
#include <cstddef>
template<typename T, std::size_t... Is, typename... Extra>
constexpr auto extend_impl(std::array<T, sizeof...(Is)> const& base,
std::index_sequence<Is...>,
Extra&&... extra)
{
return std::array{base[Is]..., std::forward<Extra>(extra)...};
}
template<typename T, std::size_t N, typename... Extra>
constexpr auto extend(std::array<T, N> const& base, Extra&&... extra)
{
return extend_impl(base, std::make_index_sequence<N>{},
std::forward<Extra>(extra)...);
}
constexpr std::array base = {1, 2, 3};
constexpr std::array extended = extend(base, 4, 5, 6);
int main()
{
for(auto e : extended)
std::cout << e << " ";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.