cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Type-safe measurement units in fashion of std::chrono #356

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +6, -0 Автор идеи: post-increment

Помимо типо-безопасных единиц времени, представленных в std::chrono, хочется иметь также типо-безопасные единицы измерения (длины, массы и др.)

Хочется, чтобы всё это было реализовано в концепции аналогичной и дружественной std::chrono. Представляется разумным, чтобы можно было единицы с собой спаривать в операциях умножения и деления. Например, длина/время -> скорость. Сейчас время/время (при допустимых типах представителя rep) - безразмерная величина - уже логичный задел. Аналогично и для других единиц измерения. Сразу видится, что, если за единицу длины возьмём метр - std::ratio<1,1>, то единицей скорости будет метр в секунду - std::ratio<1,1>. Километры в час соответственно представлены std::ratio<1000,3600>=std::ratio<5,18>. И т.д.

Я припоминаю были также другие доклады и статьи на эту тему. Навскидку например нашёл: https://github.com/nholthaus/units https://www.boost.org/doc/libs/1_65_0/doc/html/boost_units/Examples.html#boost_units.Examples.DimensionExample https://github.com/martinmoene/PhysUnits-CT

Дизайны уж очень местами отличаются от std::chrono. ИМХО, если брать в стандарт, то только что-то концептуально схожее и совместимное с std::chrono.

apolukhin commented 3 years ago

yndx-antoshkka, 10 сентября 2018, 11:57 Близкое по духу предложение: #300

Один умный человек в комитете мне говорил, что он согласится принять подобную библиотеку в стандарт, только если она действительно будет универсальной и всеобъемлющей. Поэтому он всегда спрашивает, "можно ли с вашим предложением посчитать '(5 локтей + 3 вершка + 7 английских морских узлов) / световой год' и 'униция / 9 бит'"

apolukhin commented 3 years ago

Mateusz Pusz сейчас работает над этой проблемой. Попрбуйте его библиотеку, дайте feedback если что-то не так https://github.com/mpusz/units