问题描述
我想像这样在编译时比较字符串视图:
constexpr bool isMatch(const string_view str) {
if constexpr (str == "firstMatch"sv) {
return true;
} else if constexpr (str == "secondMatch"sv) {
return true;
}
// ....
}
isMatch("something"sv);
这显然是常量,因为它在代码中是正确的。
但是编译器说 if constexpr 中的表达式“没有计算为常量”。但是 string_view 的 operator== 是 constexpr。一种解决方案是声明参数 constexpr,但这是不可能的。
那么我怎样才能有一个 constexpr 函数来在编译时检查这些类型的匹配?
解决方法
我怎样才能有一个 constexpr 函数来检查这些类型的匹配
只需从 constexpr
中删除 if
。
constexpr bool isMatch(const string_view str) {
if (str == "firstMatch"sv) {
return true;
} else if (str == "secondMatch"sv) {
return true;
}
return false;
}
std::string_view::operator==
是 constexpr
所以一切都很好。
在编译时?
在编译时上下文中调用您的函数。喜欢:
#include <array>
#include <cassert>
#include <string_view>
using namespace std::literals;
constexpr bool isMatch(const std::string_view str) {
if (str == "firstMatch"sv) {
return true;
} else if (str == "secondMatch"sv) {
return true;
}
return false;
}
int main() {
std::array<int,isMatch("secondMatch"sv)> arr;
static_assert(isMatch("firstMatch"sv));
constexpr bool var = isMatch("No match for you!"sv);
}
在 C++20 中,您可以确保仅在编译时使用 consteval
调用您的函数。