수색…


긴 double 값을 가진 사용자 정의 리터럴

#include <iostream>

long double operator"" _km(long double val)
{
    return val * 1000.0;
}

long double operator"" _mi(long double val)
{
    return val * 1609.344;
}

int main()
{
    std::cout << "3 km = " << 3.0_km << " m\n";
    std::cout << "3 mi = " << 3.0_mi << " m\n";
    return 0;
}

이 프로그램의 출력은 다음과 같습니다.

3 km = 3000 m
3 mi = 4828.03 m

지속 기간 동안 표준 사용자 정의 리터럴

C ++ 14

이어지는 사용자 리터럴은 namespace std::literals::chrono_literals 에서 선언됩니다. 여기서 literalschrono_literals 는 모두 인라인 네임 스페이스 입니다. 이 연산자에 대한 액세스는 using namespace std::literalsusing namespace std::chrono_literalsusing namespace std::literals::chrono_literals 있습니다.

#include <chrono>
#include <iostream>

int main()
{
    using namespace std::literals::chrono_literals;

    std::chrono::nanoseconds t1 = 600ns;
    std::chrono::microseconds t2 = 42us;
    std::chrono::milliseconds t3 = 51ms;
    std::chrono::seconds t4 = 61s;
    std::chrono::minutes t5 = 88min;
    auto t6 = 2 * 0.5h;

    auto total = t1 + t2 + t3 + t4 + t5 + t6;

    std::cout.precision(13);
    std::cout << total.count() << " nanoseconds" << std::endl; // 8941051042600 nanoseconds
    std::cout << std::chrono::duration_cast<std::chrono::hours>(total).count()
              << " hours" << std::endl; // 2 hours
}

문자열에 대한 표준 사용자 정의 리터럴

C ++ 14

다음의 문자열 사용자 리터럴은 std::literals::string_literals namespace 에서 선언됩니다. 여기서 literalsstring_literals 은 모두 인라인 네임 스페이스 입니다. 이 연산자에 대한 액세스는 using namespace std::literalsusing namespace std::string_literalsusing namespace std::literals::string_literals 하고, using namespace std::literals::string_literalsusing namespace std::literals 얻을 수 있습니다.

#include <codecvt>
#include <iostream>
#include <locale>
#include <string>

int main()
{
    using namespace std::literals::string_literals;

    std::string s = "hello world"s;
    std::u16string s16 = u"hello world"s;
    std::u32string s32 = U"hello world"s;
    std::wstring ws = L"hello world"s;
    
    std::cout << s << std::endl;

    std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> utf16conv;
    std::cout << utf16conv.to_bytes(s16) << std::endl;

    std::wstring_convert<std::codecvt_utf8_utf16<char32_t>, char32_t> utf32conv;
    std::cout << utf32conv.to_bytes(s32) << std::endl;

    std::wcout << ws << std::endl;
}

노트 :

리터럴 문자열에 \0 포함될 수 있습니다.

std::string s1 = "foo\0\0bar";  // constructor from C-string: results in "foo"s
std::string s2 = "foo\0\0bar"s; // That string contains 2 '\0' in its middle

복잡한 사용자 정의 리터럴 표준

C ++ 14

다음의 복잡한 사용자 리터럴은 std::literals::complex_literals namespace 에서 선언됩니다. 여기서 literalscomplex_literals인라인 네임 스페이스 입니다. 이 연산자에 대한 액세스는 using namespace std::literalsusing namespace std::complex_literalsusing namespace std::literals::complex_literalsusing namespace std::literals 얻을 수 있습니다.

#include <complex>
#include <iostream>

int main()
{
    using namespace std::literals::complex_literals;
    
    std::complex<double> c = 2.0 + 1i;        // {2.0, 1.}
    std::complex<float> cf = 2.0f + 1if;      // {2.0f, 1.f}
    std::complex<long double> cl = 2.0L + 1il; // {2.0L, 1.L}
    
    std::cout << "abs" << c << " = " << abs(c) << std::endl;   // abs(2,1) = 2.23607
    std::cout << "abs" << cf << " = " << abs(cf) << std::endl; // abs(2,1) = 2.23607
    std::cout << "abs" << cl << " = " << abs(cl) << std::endl; // abs(2,1) = 2.23607
}

바이너리 용으로 자체 제작 된 사용자 정의 리터럴

그럼에도 불구하고 C ++ 14에서 이진수를 쓸 수 있습니다.

int number =0b0001'0101; // ==21

다음은 이진수에 대한 자체 구현을 사용한 유명한 예입니다.

참고 : 전체 템플릿 확장 프로그램이 컴파일 타임에 실행 중입니다.

template< char FIRST, char... REST > struct binary
{
    static_assert( FIRST == '0' || FIRST == '1', "invalid binary digit" ) ;
    enum { value = ( ( FIRST - '0' ) << sizeof...(REST) ) + binary<REST...>::value  } ;
};

template<> struct binary<'0'> { enum { value = 0 } ; };
template<> struct binary<'1'> { enum { value = 1 } ; };


// raw literal operator
template<  char... LITERAL > inline
constexpr unsigned int operator "" _b() { return binary<LITERAL...>::value ; }

// raw literal operator
template<  char... LITERAL > inline
constexpr unsigned int operator "" _B() { return binary<LITERAL...>::value ; }

#include <iostream>

int main()
{
    std::cout  << 10101_B << ", " << 011011000111_b  << '\n' ; // prints 21, 1735
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow