2013-06-22 7 views
2

이와 같은 행동을 취할 수있는 방법이 있습니까? 문자열 리터럴 some_return_type operator "" _my_str(const char*, std::size_t); 즉시 전달 결코 문자 그대로의 운영자 템플릿 (2.14.8/5)에 있기 때문에사용자 정의 문자열 리터럴의 길이를 템플릿 인수로 사용합니까?

// Some definition(s) of operator "" _my_str 
// Some definition of function or macro MY_STR_LEN 

using T1 = MY_STR_LEN("ape"_my_str); 
// T1 is std::integral_constant<std::size_t, 3U>. 

using T2 = MY_STR_LEN("aardvark"_my_str); 
// T2 is std::integral_constant<std::size_t, 8U>. 

그것은하지 보인다. size 함수 매개 변수는 거의 항상 상수식이 되더라도 템플릿 인수로 사용할 수 없습니다.

하지만 이렇게해야 할 것처럼 보입니다.

답변

3

C++ 11 2.14.8은 "리터럴 연산자 템플릿"이 숫자 리터럴에만 고려되지만 문자열과 문자 리터럴에 대해서는 이 아닌임을주의 깊게 나타냅니다.

그러나, 다음과 같은 접근 방식은 당신에게 constexpr 문자열 길이에 대한 액세스 (하지만 포인터)를 제공하는 것 같다

struct MyStr 
{ 
    char const * str; 
    unsigned int len; 
    constexpr MyStr(char const * p, unsigned int n) : str(p), len(n) {} 
}; 

constexpr MyStr operator "" _xyz (char const * s, unsigned int len) 
{ 
    return MyStr(s, len); 
} 

constexpr auto s = "Hello"_xyz; 

테스트 :

#include <array> 

using atype = std::array<int, s.len>; // OK 
+0

네,하지만 그것은 하나의 특정을 위해 단지 객체's입니다. 그래서 우리는 모든 사용자 정의 리터럴에 대한 이름이 필요합니까? – aschepler

+1

@aschepler :''abc "_xyz.len'과 같은 것이 작동해야합니다. –