C++ C++;在constexpr if中使用string_视图
我想在编译时比较字符串视图,如下所示:C++ C++;在constexpr if中使用string_视图,c++,constexpr,string-view,C++,Constexpr,String View,我想在编译时比较字符串视图,如下所示: constexpr bool isMatch(const string\u view str){ 如果constexpr(str==“firstMatch”sv){ 返回true; }如果constexpr(str==“secondMatch”sv),则为else{ 返回true; } // .... } 函数的调用方式如下: isMatch(“某物”sv); 这显然是常数,因为它在代码中是正确的 但是编译器说if constexpr中的表达式“没有计
constexpr bool isMatch(const string\u view str){
如果constexpr(str==“firstMatch”sv){
返回true;
}如果constexpr(str==“secondMatch”sv),则为else{
返回true;
}
// ....
}
函数的调用方式如下:
isMatch(“某物”sv);
这显然是常数,因为它在代码中是正确的
但是编译器说if constexpr中的表达式“没有计算为常量”。但是string_视图的运算符==是constexpr。解决方案是声明参数constexpr,但这是不可能的
那么,我怎样才能有一个constexpr函数在编译时检查这些匹配呢
如何使用constexpr函数检查此类匹配
只需从if
s中删除constepr
constexpr bool isMatch(const string_view str) {
if (str == "firstMatch"sv) {
return true;
} else if (str == "secondMatch"sv) {
return true;
}
return false;
}
std::string\u view::operator=
是constepr
,所以一切正常
在编译时
在编译时上下文中调用函数。比如:
#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);
}
#包括
#包括
#包括
使用名称空间std::literals;
constexpr bool isMatch(const std::string\u view str){
如果(str==“firstMatch”sv){
返回true;
}else if(str==“secondMatch”sv){
返回true;
}
返回false;
}
int main(){
std::阵列arr;
静态_断言(isMatch(“firstMatch”sv));
constexpr bool var=isMatch(“不适合你!”sv);
}
在C++20中,如果constexpr,您可以确保只在编译时使用
consteval从中删除constexpr
。您的str
参数不是constexpr,因此表达式str==“abc”
不是constexpr。请注意,constepr
函数可以在运行时调用,这意味着str
可能是运行时已知的值,因此您不能总是保证该值在编译时已知。@KamilCuk如果我删除constepr,我不能保证代码将在编译时执行,并且我不能进行静态断言(假“无效str”)
以确保str有效。如果在编译时调用函数,则无论If
是否为constexpr
,正文显然也会在编译时执行。If constexpr
在必须处理不同类型和模板参数时最有用。如果要确保如果你的代码在编译时运行,并且你有C++20,你可以改为使用函数consteval
。好的,看起来不错,但是如果我有一个函数foo(bool match)
并像调用foo(isMatch(“test”sv))那样调用它,我可以在编译时执行吗
?在这种情况下,isMatch
是编译时吗?因为我可以定义一个constexpr bool match=isMatch(“test”sv)
,然后调用foo(match)
,但这太麻烦了,我想直接传递它。你必须将“保证编译时”与“是编译时”分开.理论上,当您编写foo(1==1)时
不能保证1==1
比较将在编译时执行。但实际上,任何编译器都会对其进行优化。它与constepr
函数类似。可以在运行时执行constepr
函数。但任何自尊的编译器都会对其进行优化。因此,回答foo(isMatch)(“test”sv))?isMatch是否是编译时的
对此没有任何保证,但它将是。如果您需要这种保证,请明确地向编译器传达这一意图。