2020년 7월 1일 수요일

사용자 정의 리터럴

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 (파라미터)

이런 식으로 하는데, _가 맨첨에 나오면 그 뒤는 영어 숫자 조합도 해도 됀다.

일일히 자료형 생성자 호출하지 않는 좋은 방법인 듯 하다.

댓글 없음:

댓글 쓰기

List