是否可以迭代 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)
由于您示例中的
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;
}