MyTetra Share
Делитесь знаниями!
Пример использования constexpr и operator для задания величин с размерностью
Время создания: 14.06.2023 09:07
Автор: Xintrea
Текстовые метки: C++, Си++, constexpr, operator, оператор, функция, значение, величина, размерность, единица измерения, суффикс, suffix, постфикс, postfix, пользовательский литерал
Раздел: Компьютер - Программирование - Язык C++ (Си++)
Запись: xintrea/mytetra_syncro/master/base/1686722841ljcbv77ux8/text.html на raw.github.com

В современном C++ можно "конструировать" величины с размерностью. То есть, можно создавать такие функции, которые будут обрабатывать выражения с постфиксом, и в компил-тайме преобразовывать их в готовые значения. Звучит сложно, но на деле все гораздо проще.


Вот пример кода:



using ull = unsigned long long;


constexpr ull operator"" _KB(ull value)

{

return value * 1024;

}


constexpr ull operator"" _MB(ull value)

{

return value * (1024_KB);

}


cout << 10_KB << endl;

cout << 500_MB << endl;



Данный код распечатает количество байт в 10 килобайтах и количество байт в 50 мегабайтах.



Такие функции определения оператора "" (две кавычки), которые обычно (но необязательно) написаны с помощью constexpr, и которые для определения своего имени используют постфикс, называются пользовательскими литералами.



Благодаря выражению constexpt можно добиться того, что все вычисления будут выполнены в компилтайме, если величины, используемые в выражениях вместе с такими пользовательскими литералами, известны на этапе компиляции (являются предопределенными константами).


В данном примере итоговый тип выражения пользовательского литерала - это просто unsigned long long.



Говорят, что можно доработать данный код так, чтобы был контроль типов. Например, чтобы нельзя было смешать километры и килобайты без явного преобразования. Не совсем ясно для чего это нужно, ведь в физических формулах часто разные типы величин находятся в одном выражении, главное чтобы итоговый тип формулы соответствовал ожидаемой единице измерений. Одним только контролем типов контроля единиц измерений в общем случае добиться не получится.



То есть, по сути, в вышеприведенном коде нет ничего сверхестественного, это просто удобный преобразователь беззнаковых целочисленных величин, не более того.


Так же в этом разделе:
 
MyTetra Share v.0.60
Яндекс индекс цитирования