如何标记函数参数为constexpr?字符串字面量编译期处理方案
解决字符串字面量编译期处理的几种办法
既然你能保证func1的str参数永远是字符串字面量,那可以用下面这些C++20及以后的方法实现编译期处理:
方法一:用std::string_view非类型模板参数
C++20开始支持把std::string_view作为非类型模板参数,直接把字符串字面量绑定进去,这样就能在编译期传给consteval函数了:
#include <string_view> #include <iostream> consteval bool func2(std::string_view str) { return str[0] == 'a'; } template<std::string_view Str> bool func1(bool flag) { return flag && func2(Str); } int main() { bool flag = false; // 直接把字符串字面量作为模板参数传递 std::cout << func1<"abc">(flag) << std::endl; }
这里Str是编译期确定的std::string_view,传给consteval的func2完全符合常量表达式要求,编译期就能完成判断。
方法二:用字符数组引用作为模板参数
如果不想用std::string_view,也可以直接把字符串字面量绑定到模板的字符数组引用上:
#include <iostream> consteval bool func2(const char* str) { return str[0] == 'a'; } template<std::size_t N, const char (&Str)[N]> bool func1(bool flag) { return flag && func2(Str); } int main() { bool flag = false; std::cout << func1<"abc">(flag) << std::endl; }
模板参数里的Str是对字符串字面量数组的引用,属于编译期常量,传给consteval函数不会有问题。
额外说明
这两种方法都能满足你的需求:字符串字面量在编译期被处理,flag作为运行时参数不影响逻辑。只要调用func1时传入的是字符串字面量(或者其他编译期常量字符串),编译期就能完成func2的计算,运行时只需要处理flag的逻辑即可。
内容的提问来源于stack exchange,提问作者Redim
相关产品推荐
相关产品推荐

