개요
- 표준 리터럴
-
| 종류 |
접미사 |
의미 |
버전 |
| 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> >