2014-07-22 1 views
15

사용자 정의 문자열 리터럴 변환 연산자를 정의 할 수 있습니까? 그 결과의 유형은 문자열 입력 값에 따라 다릅니 까?종속 유형이있는 문자열 리터럴 - 불가능합니까?

사용자 정의 정수 및 부동 소수점 리터럴은 리터럴 연산자 템플릿을 허용하기 때문에 쉽고 리터럴의 실제 문자는 템플릿 인수로 전달되기 때문에 쉽게 정의 할 수 있습니다. 예 :

template <char... s> struct silly { using type = int; }; 
template <char... s> struct silly<'1', s...> { using type = double; }; 

template <char... s> 
typename silly<s...>::type operator"" _silly() { return 0; } 

static_assert(std::is_same<int, decltype(4321_silly)>::value, "no luck"); 
static_assert(std::is_same<double, decltype(1234_silly)>::value, "no luck"); 

사용자 정의 문자열 리터럴에는 이러한 사항이 존재하지 않습니다.

현재 표준에서 또는 향후 개정판에 대해 계획되었거나 논의 된 다른 방법이 있을까요?

+3

이 템플릿 인수 문제에 대해 알지 못했습니다. 그리고 그것은 아주 멋집니다. – Quentin

+8

우리가''문자열 리터럴을위한 UDL 연산자를 얻지 못하면 불가능합니다 : ( – Xeo

+2

새로운 표준의 많은 부분이 불완전하고 비 직교 해 보입니다. * 한숨 *. 아마도 5 ~ 10 년 후에 수정 될 것입니다. – Mankarse

답변

1

진부한 매크로 해커 외에는 불가능하지 않습니다. 문자열 리터럴은 constexpr을 통해 액세스되며 반환 유형 constexpr은 인수 값에 의존 할 수 없습니다.

문자열 리터럴 <char...>operator""는 "원시 또는 처리"문제를 문제로 실행하고 지정하는 방법을, 다음 표준 시간에서 이러한 문제를 해싱하는 것은 어려울 및/또는 것이기 때문에 어디에 떨어 ROI는 것 제안 낮아. (적어도 일어난 일에 대한 나의 캐주얼 읽기부터).

포도 나무에서 죽었는지 또는 아직 작업 중인지 모르겠습니다.

해커는 <arr[0], arr[1], arr[2]>을 수동으로 template pseduo로 전달하고 사용자 정의 리터럴 구문을 (직접적으로) 포함하지 않을 것입니다. 그것은 많은 문제점을 가지고 있습니다.