如何在编译时验证 std::array 大小?

问题描述 投票:0回答:1

我定义了一个静态 constexpr std::array ,其字符串视图如下:

 constexpr int array_size = 6;
 static constexpr std::array<std::string_view, array_size> texts = {{"one", "two", "three"}};

在编译过程中,我想检查数组的大小(

array_size
)是否与数组中的项目数相对应(如果
string_view
为“”或已填充,则可以检查)。如果
texts
数组中缺少字符串,如何在编译时执行此操作并向用户显示错误?这可以通过
static_assert
实现吗?还是有其他方法可以在 C++20 中实现此目的?

c++ arrays compilation c++20
1个回答
0
投票

在 C++20 中,您可以使用 std::to_array 以及自定义用户定义文字来实现数组大小的编译时检查。这是一个例子:

#include <array>
#include <string_view>

// User-defined literal for string_view
constexpr std::string_view operator""_sv(const char* str, std::size_t size) {
    return std::string_view(str, size);
}

// Function to check array size
template <typename T, std::size_t N>
constexpr std::size_t check_array_size(const T (&)[N], std::size_t expected_size) {
    static_assert(N == expected_size, "Incorrect array size");
    return N;
}

// Define the array with user-defined literal
constexpr auto texts = std::to_array({
    "one"_sv,
    "two"_sv,
    "three"_sv
});

// Check the array size at compile-time
constexpr std::size_t array_size = check_array_size(texts, 3);

int main() {
    // Use array_size as needed
    return 0;
}

在此示例中:

  • 用户定义的literal _sv用于创建std::string_view 文字。
  • check_array_size函数模板采用对数组的引用 和预期的大小。它使用静态断言来检查 数组大小与预期大小相符。
  • std::to_array函数用于将初始化列表转换为 一个 std::array.
  • 然后将
  • constexpr 变量 array_size 设置为 数组,并调用 check_array_size 函数来强制执行 编译时检查大小。
如果数组的大小与预期大小不匹配,静态断言将触发编译错误。

© www.soinside.com 2019 - 2024. All rights reserved.