是否可以在编译时判断一个string_view是否指向一个字符串字面量?
我想返回一个视图的子视图,同时尽量避免分配新的字符串。
因此如果输入的视图引用的是一个字符串字面量,我可以返回一个 std::string_view,否则我必须返回一个 std::string。
constexpr auto process(std::string_view input)
{
std::string_view result;
...
// results is now a sub-string-view of input
if constexpr ("input is referring to a string literal")
{
return result;
}
else
{
return std::string(results);
}
}
编译期检查是否可行?如果可行,怎么实现?
如果函数在运行时被调用并传入其他参数(例如在string_view中给定的运行时位置),这会带来什么变化?
注:首选使用C++20的解法,但如果不可行,也可提供适用于更高标准的解法以供参考。
解决方案
我觉得没有办法判断指针的“起源/生命周期”。
不过你可以为编译期和运行时各自提供一个重载:
#include <iostream>
#include <string>
#include <string_view>
template <std::size_t N>
struct LiteralString
{
consteval LiteralString(const char (&s)[N]) { std::copy(s, s + N, &data[0]); }
constexpr operator std::string_view() const { return {data, data + N}; }
static constexpr std::size_t size = N;
char data[N]{};
};
template <LiteralString input>
constexpr std::string_view process() {
return input;
}
std::string process(std::string_view input) {
return std::string(input);
}
int main() {
std::cout << process<"string0">() << '\n';
std::cout << process("string1") << '\n';
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。