Какие новые возможности пользовательские литералы добавляют в C ++?
C ++ 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
так что порядок оценки оператора работает, но он неуклюжий.
Итак, к чему сводится мой вопрос: считаете ли вы, что эта функция оправдает себя? Какие еще литералы вы хотели бы определить, чтобы сделать ваш код C ++ более читабельным?
Обновлен синтаксис для соответствия окончательному проекту в июне 2011 года