对 constexpr 数组的每个元素进行 C++ constexpr 操作

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

是否可以迭代 constexpr C 数组/std::array/向量并对每个元素执行 constexpr 操作以及编译时要完成的所有操作?

https://godbolt.org/z/5a4v3Eerh

#include <string_view>
using namespace std::string_view_literals;

constexpr std::string_view arr[] = {"ab"sv, "xyz"sv,};

int main(){
    static_assert(arr[0] == "ab");  //OK
    static_assert(arr[1] == "xyz");

    #if 0 //would something like this be possible?
    for(const auto i: arr){
        static_assert(i == "xyz"); //???
    }
    #endif
    return 0;
}

我使用了 static_assert() 但可能有任何 constexpr 函数...

如有任何建议,我们将不胜感激!任何 C++ 标准(最好是最新的)、任何编译器(最好是 Microsoft VisualStudio 2022)

c++ arrays constexpr static-assert
1个回答
0
投票

由于您示例中的

i
不是
constexpr
而只是
const
,因此它不起作用。但是,您可以使用
constexpr
consteval
函数,其中函数局部变量不必是
constexpr
,但整个函数本身仍会在编译时进行计算。

#include <string_view>
#include <algorithm>
#include <ranges>

using namespace std::string_view_literals;

template <std::size_t N>
consteval bool arrContainsOnly(const std::string_view(&arr)[N], const std::string_view s) {
    for (const auto& i : arr) {
        if (i != s) {
            return false;
        }
    }
    return true;
}

int main(){
    constexpr std::string_view arr1[] = {"ab"sv, "xyz"sv,};
    constexpr std::string_view arr2[] = {"xyz"sv, "xyz"sv, "xyz"sv};

    static_assert(!arrContainsOnly(arr1, "xyz"sv));
    static_assert(arrContainsOnly(arr2, "xyz"sv));

    static_assert(std::all_of(std::begin(arr2), std::end(arr2),
                [](const std::string_view& i) { return i == "xyz"sv; }));
    static_assert(std::ranges::all_of(arr2,
                [](const std::string_view& i) { return i == "xyz"sv; }));

    return 0;
}

实例

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