С++ 11 представляет пользовательские литералы что позволит ввести новый литерал-синтаксис на основе существующих литералов (int
, hex
, string
, float
), чтобы любой тип мог иметь литеральное представление.
<сильные > Примеры:
// imaginary numbers
std::complex<long double> operator "" _i(long double d) // cooked form
{
return std::complex<long double>(0, d);
}
auto val = 3.14_i; // val = complex<long double>(0, 3.14)
// binary values
int operator "" _B(const char*); // raw form
int answer = 101010_B; // answer = 42
// std::string
std::string operator "" _s(const char* str, size_t /*length*/)
{
return std::string(str);
}
auto hi = "hello"_s + " world"; // + works, "hello"_s is a string not a pointer
// units
assert(1_kg == 2.2_lb); // give or take 0.00462262 pounds
На первый взгляд это выглядит очень круто, но мне интересно, насколько это применимо, когда я пытался подумать о том, что суффиксы _AD
и _BC
создают даты, которые я обнаружил, что это проблема из-за порядка оператора. 1974/01/06_AD
сначала оценил бы 1974/01
(как обычный int
s), а только позже 06_AD
(не говоря уже о августе и сентябре, которые должны быть записаны без 0
по восьмеричным причинам). Это можно обойти, если синтаксис будет 1974-1/6_AD
, так что порядок оценки оператора работает, но он неуклюж.
Итак, что мой вопрос сводится к этому, чувствуете ли вы, что эта функция оправдает себя? Какие другие литералы вы хотели бы определить, что сделает ваш код на С++ более удобочитаемым?
Обновлен синтаксис, чтобы он соответствовал окончательному проекту в июне 2011 года.