2017-09-19 2 views
0

컴파일 타임에 상수 문자열에 특정 문자가 들어 있지 않은지 확인하는 방법이 필요합니다. static_assert를 사용하려고 생각했지만 벽돌 벽에 부딪쳤다. 정적이 아닌 .find 메서드를 사용하려고했기 때문이다.컴파일 타임에 또는 적어도 사용하기 전에 문자열에 금지 된 문자가 포함되어 있는지 확인하는 창의적인 방법은 무엇입니까?

클래스의 생성자에서 체크를 할 수있는 옵션이 있습니다 (인스턴스는 해당 클래스의 static const입니다).
글 머리 기호를 물지 않기 전에 (생성자 동작을 변경하면 다른 의미가 있기 때문에) 컴파일 타임에이 작업을 수행하기 위해 다른 사람이 독창적이고 독창적 인 아이디어를 가지고 있는지 확인하고 싶습니다. . std::string는 상수 표현식에서 사용할 수 없습니다에 대한

+1

C- 리터럴 문자열에서 constexpr 함수를 사용할 수 있습니다. Gcc도 확장이 있으므로 리터럴 문자열에 udl을 허용합니다. – Jarod42

+0

Spot on! 나는 그걸 작동시킬 수 있었다. 나는 아래의 @AndyG 대답이 더 읽기 쉽다고 생각하지만 (다른 사람들을 도와주는 답으로 표시 함), 이것은 내가 당신의 제안에 따라 처리 할 수 ​​있었던 것입니다 : –

답변

4

상수 문자열에 의해 아마 당신은,문자열 리터럴을 의미한다. 우리가 constexpr의 장점을 취할 수있는 문자열 리터럴 경우

: (Live Demo)

template<int N> 
constexpr bool has_forbidden_char(const char (&str) [N], char forbidden) 
{ 
    for(int i = 0; i < N; ++i) 
    { 
     if (str[i] == forbidden) 
      return true; 
    } 
    return false; 
} 

int main() 
{ 
    static_assert(!has_forbidden_char("foobar", 'x')); 
    static_assert(has_forbidden_char("foobar", 'f')); 
} 

편집 : N-1으로 반복 당신은 문자열 리터럴 및 임의없는 문자 배열을 받게됩니다 가정하면 . 이런 식으로 매번 널 문자 '\ 0'을 검사하지 않을 것입니다.

//... 
for(int i = 0; i < N-1; ++i){ //... 

Edit2가을 (길이 제로의 배열은 C++에서 -1에서 색인에 대해 너무 걱정을 존재하지 않는) : 당신이 편안 constexpr이없는 비주얼 스튜디오 2015를 사용하고 있기 때문에 기능은 다음과 같습니다 :

namespace detail { 
    template<int N> 
    constexpr bool has_forbidden_char_help(const char(&str)[N], char forbidden, int index) 
    { 
     return (index < N && (str[index] == forbidden || has_forbidden_char_help(str, forbidden, index+1))); 
    } 
} // namespace detail 

template<int N> 
constexpr bool has_forbidden_char(const char (&str) [N], char forbidden) 
{ 
    return detail::has_forbidden_char_help(str, forbidden, 0); 
} 

int main() 
{ 
    static_assert(!has_forbidden_char("foobar", 'x'), "foobar doesn't have x, so this shouldn't fail..."); 
    static_assert(has_forbidden_char("foobar", 'f'), "foobar does have f, so this shouldn't fail..."); 
} 
+0

상세한 예를 들어 주셔서 감사합니다, @AndyG. 불행히도 제 컴파일러 (VS2015)는 사용하고 컴파일러를 전환하는 많은 구성 요소를 좋아하지 않았습니다. –

+0

@SeeSharper : 잠시만 기다려주세요. VS2015 준수 버전을 만들겠습니다. – AndyG

+0

@SeeSharper : 편집 된 답변보기 :-) – AndyG

관련 문제