Nowy dosłowne pojęcie zdefiniowane przez użytkownika w języku C++ sugeruje kilka bardzo interesujących zastosowań String literały, takich jak:Czy literowe zdefiniowane przez użytkownika łańcuchy mogą być silnie wpisane?
"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;
Jednak, kiedy budować te rodzaje konstrukcji w gcc, np:
template <char... Chars> Name<Chars...> operator "" _name() {
return Name<Chars...>();
}
auto a = 123_name; // OK
auto b = "abc"_name; // Error
pojawia się następujący błąd:
…unable to find string literal operator ‘operator"" _name’ with ‘const char [4]’, ‘long unsigned int’ arguments
Od czytania wokół, zgaduję, że postać o zmiennej liczbie argumentów-szablon nie jest dostępna do UDLS czerpią d od literałów ciągowych.
- Czy w rzeczywistości literały łańcuchowe nie mogą zostać rozwiązane przy użyciu formularza szablonu variadic?
- Jeśli tak, to czy ktoś ma jakiś wgląd w to, dlaczego taka użyteczna forma UDL była poza standardem?
Co dokładnie jest przydatne w tworzeniu nowego typu dla każdego dosłownego, rodzaju, który byłby całkowicie odrębny od siebie? –
@NicolBolas: W pokazanych przykładach * chcesz * różne literały mieć różne typy. Co więcej, ostateczny typ literału niekoniecznie będzie naiwnym połączeniem jego postaci. Na przykład, "freq:% g Hz" świat "_fmt (44000)" może przekształcić się w coś podobnego do 'Formatter (" freq: "," Hz ") (44000)' za pomocą metaprogramowania –
To by również oznaczało że * nie możesz * przekazać jej czegoś, co nie jest liczbą, więc nie możesz przekazać jej czegoś, co może użyć 'operator <<' do przekształcenia w strumień, co eliminuje możliwość dostosowywania typów danych. –