请考虑以下代码:
using char_type = /*implementation defined*/;
void foo(const char_type*);
int main()
{
foo("Hello World!");
}
字符串字面量
"Hello World!"
是一个const char*
,根据实现方式,它可能无法转换为const char_type*
。我希望我的代码在不同的实现之间具有可移植性,因此我想定义一个字面量来逐个字符进行转换(这种类型的转换被保证可以工作)。consteval const char_type* operator"" _s(const char*, size_t);
然后像这样使用 foo("Hello World!"_s)
。但是我能想到的唯一实现方式是使用new
来分配空间和std::copy
,但这会非常慢。我希望能在编译时进行转换,幸运的是我可以使用C++20和consteval
关键字来确保对该函数的调用始终产生一个常量表达式(用户定义的字面量仍然是普通函数,它们可以在运行时调用)。有什么好的实现方法吗?
std::basic_string
用于处理不同的字符类型?你也可以采用微软的方式,使用宏自动添加适当的前缀到所有字符串字面量中,例如#define T(s) L ## s
或类似的方式,然后使用foo(T("Hello world"))
。 - Some programmer dudestd::basic_string<T>
转换为std::basic_string<U>
,此外它不能在编译时使用。我从未听说过这种微软的方式,它是如何工作的? - user7769147