繁体   English   中英

如何使用基数组扩展 C++ 中的常量数组

[英]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};

(参见https://godbolt.org/z/bGeGeP

使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM