struct FloatRapping
{
FloatRapping(const float& var) : value(var) {}
float value;
};
FloatRapping operator"" _f(long double d)
{
return FloatRapping(d);
}
FloatRapping operator"" _f(unsigned long long d)
{
return FloatRapping(d);
}
FloatRapping operator"" _f(const char* str, size_t len)
{
float result = 0.0f;
int n_dot = len;
for (int i = 0; i < len; i++)
if (str[i] == '.')
n_dot = i;
// 415.12
// 012345
for (int i = 0; i < len; i++)
{
if (i == n_dot) continue;
result += (str[i] - 48) * powf(10, (n_dot - i - (i < n_dot ? 1 : 0)));
}
return FloatRapping(result);
}
void main()
{
// user define literal
int explic_1 = static_cast<int>(uniform);
int explic_2 = int(uniform);
auto var = "123.45"_f;
auto var2 = 123_f;
auto var3 = 123.4f;
}
c++엔 리터럴 표준이 있다.
1.3f (float), 0xabcd (16진수), "ㄴㄹㄴㅁㅇㄻㄴㅇ" (C 스타일 문자열), 'ㅇ' (char) 같은 것이다.
리터럴 표준은 신성한 건줄 알았는데, 이를 C++11 은 사용자 커스터마이즈도 시켜준다.
모드는 두가지로, 가공모드와 미가공 모드이다.
미가공모드는 문자열과 그 크기를 인자로 받는다.
가공모드는 unsigend long long, long dauble 둘 중 하나를 받는다.
정의 방법은
WanttedType operator"" _wannted (파라미터)
이런 식으로 하는데, _가 맨첨에 나오면 그 뒤는 영어 숫자 조합도 해도 됀다.
일일히 자료형 생성자 호출하지 않는 좋은 방법인 듯 하다.
댓글 없음:
댓글 쓰기