Daily bit(e) C++. Пользовательские литералы

Добавлено 26 августа 2026 в 13:15

Daily bit(e) C++ 88, поддержка пользовательских литералов в C++11.

Daily bit(e) C++

C++11 представил пользовательские литералы, позволяющие библиотекам предоставлять строго типизированные типы значений в естественном и читаемом виде.

Обратите внимание, что единственными разрешенными базовыми типами для пользовательских литералов являются unsigned long long int, long double, символьные типы и строковые литералы.

#include <print>

namespace units 
{
    struct m 
    {
        unsigned long long int value;
        friend auto operator<=>(const m&, const m&) = default;
    };

    struct km 
    {
        unsigned long long int value;
        operator m() const 
        {
            return {value*1000}; 
        }
        friend auto operator<=>(const km&, const km&) = default;
    };
}

constexpr units::km operator"" _km(unsigned long long int v) 
{
    return {v};
}

constexpr units::m operator"" _m(unsigned long long int v) 
{
    return {v};
}

int main() 
{
    if (100_m < 1_km) 
    {
        std::println("100m is less than 1km");
    }

    if (1001_m > 1_km) 
    {
        std::println("1001m is more than 1km");
    }
}

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование