[C++] literals
Updated:
개요
- 표준 리터럴
-
종류 접미사 의미 버전 string_literals s string C++14 string_view_literals sv string_view C++17 complex_literals i complex C++14 if complex C++14 il complex C++14 chrono_literals y chrono::year C++20 d chrono::day C++20 h chrono::hours C++14 chrono::duration<long int, std::ratio<3600> > C++14 min chrono::minutes C++14 chrono::duration<long int, std::ratio<60> > C++14 s chrono::seconds C++14 chrono::duration C++14 ms chrono::milliseconds C++14 chrono::duration<long int, std::ratio<1, 1000> > C++14 us chrono::microseconds C++14 chrono::duration<long int, std::ratio<1, 1000000> > C++14 ns chrono::nanoseconds C++14 chrono::duration<long int, std::ratio<1, 1000000000> > C++14
-
- 사용자 정의 리터럴
- _를 이용
- 사용 가능한 파라미터
-
파라미터 버전 const char * C++11 unsigned long long int C++11 long double C++11 char C++11 wchar_t C++11 char8_t C++20 char16_t C++11 char32_t C++11 const char * , std::size_t C++11 const wchar_t * , std::size_t C++11 const char8_t * , std::size_t C++20 const char16_t * , std::size_t C++11 const char32_t * , std::size_t C++11
-
예제
- 코드
#include <chrono> #include <complex> #include <cstring> #include <iostream> #include <string> using namespace std; class Test { public: Test(int i) { cout << "Test(int i)" << endl; } Test(string s) { cout << "Test(string s)" << endl; } void func(){}; }; Test operator""_t(unsigned long long int l) { return Test(static_cast<int>(l)); } Test operator""_t(const char *c, size_t t) { cout << t << endl; return Test(c); } template <typename T> constexpr string type_name() { const string s = __PRETTY_FUNCTION__; const int prefixSize = s.find("[with T = ") + strlen("[with T = "); return string(s.data() + prefixSize, s.find(';') - prefixSize); } void user_defined_literals_test() { Test t1 = 1_t; t1.func(); Test t2 = "abc"_t; t2.func(); } void string_literals_test() { using namespace string_literals; cout << type_name<decltype("a")>() << endl; cout << type_name<decltype("a"s)>() << endl; } void string_view_literals_test() { using namespace string_view_literals; cout << type_name<decltype("a"sv)>() << endl; } void complex_literals_test() { using namespace complex_literals; cout << type_name<decltype(1.1i)>() << endl; cout << type_name<decltype(1.1if)>() << endl; cout << type_name<decltype(1.1il)>() << endl; } void chrono_literals_test() { using namespace chrono_literals; cout << type_name<decltype(1y)>() << endl; cout << type_name<decltype(1d)>() << endl; cout << type_name<decltype(1h)>() << endl; cout << type_name<decltype(1min)>() << endl; cout << type_name<decltype(1s)>() << endl; cout << type_name<decltype(1ms)>() << endl; cout << type_name<decltype(1us)>() << endl; cout << type_name<decltype(1ns)>() << endl; } int main() { user_defined_literals_test(); cout << "------ 1" << endl; string_literals_test(); cout << "------ 2" << endl; string_view_literals_test(); cout << "------ 3" << endl; complex_literals_test(); cout << "------ 4" << endl; chrono_literals_test(); return 0; }
- 실행 결과
Test(int i) 3 Test(string s) ------ 1 const char (&)[2] std::__cxx11::basic_string<char> ------ 2 std::basic_string_view<char> ------ 3 std::complex<double> std::complex<float> std::complex<long double> ------ 4 std::chrono::year std::chrono::day std::chrono::duration<long int, std::ratio<3600> > std::chrono::duration<long int, std::ratio<60> > std::chrono::duration<long int> std::chrono::duration<long int, std::ratio<1, 1000> > std::chrono::duration<long int, std::ratio<1, 1000000> > std::chrono::duration<long int, std::ratio<1, 1000000000> >