На мой взгляд, использование литералов для Boost.Units не слишком выгодно, поскольку при существующих возможностях все еще можно добиться более мощного синтаксиса.
В простых случаях, похоже, что литералы - это путь, но вскоре вы видите, что он не очень мощный.Например, вам все еще нужно определить литералы для объединенных единиц, например, как вы выражаете 1 м / с (один метр в секунду)?
В настоящее время:
auto v = 1*si::meter/si::second; // yes, it is long
, но слитералы?
// fake code
using namespace boost::units::literals;
auto v = 1._m_over_s; // or 1._m/si::second; or 1._m/1_s // even worst
Лучшее решение может быть достигнуто с помощью существующих функций.И вот что я делаю:
namespace boost{namespace units{namespace si{ //excuse me!
namespace abbreviations{
static const length m = si::meter;
static const time s = si::second;
// ...
}
}}} // thank you!
using namespace si::abbreviations;
auto v = 1.*m/s;
Таким же образом вы можете сделать: auto a = 1.*m/pow<2>(s);
или расширить аббревиатуры, если хотите (например, static const area m2 = pow<2>(si::meter);
)
Что еще кроме этого вы хотите?
Может быть, комбинированное решение может быть способом
auto v = 1._m/s; // _m is literal, /s is from si::abbreviation combined with operator/
, но будет так много избыточного кода, и усиление будет минимальным(замените *
на _
после числа.)
Один из недостатков моего решения состоит в том, что оно расширяет пространство имен общими однобуквенными именами.Но я не вижу выхода из этого, кроме как добавить подчеркивание (в начало или конец аббревиатуры), как в 1.*m_/s_
, но, по крайней мере, я могу построить выражения реальных единиц.