::public/C++

사용자 정의 리터럴

해맑은욱 2020. 11. 23. 12:28
#include <iostream>
#include <chrono>
 
 
using namespace std;
 
 
class Length
{
private:
    const long double _value;
    Length(long double value) : _value(value)
    {
 
    }
 
    friend Length operator"" _m(unsigned long long value);
    friend Length operator"" _m(long double value);
    friend Length operator"" _km(unsigned long long value);
    friend Length operator"" _km(long double value);
    friend Length operator"" _mm(unsigned long long value);
    friend Length operator"" _mm(long double value);
    friend Length operator"" _cm(unsigned long long value);
    friend Length operator"" _cm(long double value);
 
public:
    long double m() const { return _value; }
    long double km() const { return _value * 0.001; }
    long double mm() const { return _value * 1000; }
    long double cm() const { return _value * 100; }
 
    Length operator+() const
    {
        return Length(_value);
    }
 
    Length operator-() const
    {
        return Length(-_value);
    }
 
    Length operator+(const Length& length) const
    {
        return Length(_value + length._value);
    }
 
    Length operator-(const Length& length) const
    {
        return Length(_value - length._value);
    }
};
 
Length operator"" _m(unsigned long long value)
{
    return Length(value);
}
 
Length operator"" _m(long double value)
{
    return Length(value);
}
 
Length operator"" _km(unsigned long long value)
{
    return Length(value * 1000L);
}
 
Length operator"" _km(long double value)
{
    return Length(value * 1000L);
}
 
Length operator"" _mm(unsigned long long value)
{
    return Length(value * 0.001L);
}
 
Length operator"" _mm(long double value)
{
    return Length(value * 0.001L);
}
 
Length operator"" _cm(unsigned long long value)
{
    return Length(value * 0.01L);
}
 
Length operator"" _cm(long double value)
{
    return Length(value * 0.01L);
}
 
int main()
{
    // 표준 라이브러리에서 사용하는 사용자 정의 리터럴
    chrono::minutes m = 24h + 5min;
    cout << m.count() << endl;
 
    Length len = 1_m + 1_km + 1_cm + 1_mm;
    cout.precision(16);
    cout << len.m() << endl;
    cout << len.km() << endl;
    cout << len.cm() << endl;
    cout << len.mm() << endl;
}
cs