在C++中新的用户定义的字面概念提出字符串常量的一些非常有趣的用途,如:基于字符串的用户定义文字是否可以强类型化?
"Goodbye %s world"_fmt("cruel");
"Goodbye %s world"_fmt(123); // Error: arg 1 must be convertible to const char*
R"(point = \((\d+), (\d+)\))"_re; // Builds DFA at compile-time.
typedef table<
column<"CustId"_name , std::string>,
column<"FirstName"_name, std::string>,
column<"LastName"_name , std::string>,
column<"DOB"_name , date >
> Customer;
然而,当我建立这些种GCC结构,例如:
template <char... Chars> Name<Chars...> operator "" _name() {
return Name<Chars...>();
}
auto a = 123_name; // OK
auto b = "abc"_name; // Error
我得到以下错误:
…unable to find string literal operator ‘operator"" _name’ with ‘const char [4]’, ‘long unsigned int’ arguments
从读书的时候,我猜的可变参数模板形式并不适用于包括UDL派生d来自字符串文字。
- 实际上是不是使用可变参数模板形式解决字符串文字的情况?
- 如果是这样,有没有人有任何洞察到为什么这样一种有用的UDL形式被排除在标准之外?
对于为每一个文字创建一个新类型,这些类型完全不同于另一个文字有什么用处? –
@NicolBolas:在示例中,您*希望*不同的文字具有不同的类型。此外,文字的最终类型不一定是其字符的简单连接。例如,'freq:%g Hz'world'_fmt(44000)'可能会通过元编程的方式解析为类似Formatter(“freq:”,“Hz”)(44000)“。 –
这也意味着你*不能传递它不是数字的东西,所以你不能传递它可能使用'operator <<'转换成流的东西,从而消除了定制数据类型的可能性。 –