2010-06-30 4 views
0

const char *에 공백이 포함되었는지 여부를 컴파일 타임에 확인 (확인) 할 수 있습니까? 같은정적 검사 const char *에 공백이 포함되었습니다.

뭔가 :

const char* cstr1 = "ok"; 
const char* cstr2 = "very bad"; 

check(cstr1); //OK 
check(cstr2); //Fail to compile 

유형은 동일하지만, 그것을 할 수있는 몇 가지 까다로운 템플릿 메타 프로그래밍 tecnique을 정의하는 것이 가능할 수있다.

포인트는 필요한 모든 정보가 컴파일 타임에 고정되어 있습니다.

이 문제는 메타 프로그래밍 기술을 통해 컴파일 타임 해시로 해결할 수있는 "const char 변수를 입력 할 때"문제와 관련이 있어야합니다.

도움을 주셔서 감사합니다.

+0

문자열 리터럴을 확인 하시겠습니까? 당신의 예제는 확실히 작동하지 않습니다. 'check ("매우 나쁨");은 덜 불가능하지만 여전히 할 방법이 없다고 생각합니다. –

답변

4

자신의 캐릭터가 템플릿에 액세스 할 수 없기 때문에 당신은 일반 문자열을 사용할 수 있지만 MPL 문자열을 사용할 수 있습니다

#include <boost/mpl/char.hpp> 
#include <boost/mpl/string.hpp> 
#include <boost/mpl/contains.hpp> 
#include <boost/utility/enable_if.hpp> 

typedef boost::mpl::char_<' '> space; 
typedef boost::mpl::string<'o', 'k'> cstr1; 
typedef boost::mpl::string<'v', 'e', 'r', 'y', ' ', 'b', 'a', 'd'> cstr2; 

boost::disable_if< boost::mpl::contains<cstr1, space> >::type check(); 
// boost::disable_if< boost::mpl::contains<cstr2, space> >::type check(); 

두 번째 줄은 컴파일되지 않습니다.

+0

이러한'disable_if'는 작업에 대한 잘못된 도구입니다. 최소한 잘못된 의도를 전달합니다. 간단한 컴파일 시간 오류를 얻으려면'BOOST_STATIC_ASSERT'가 필요합니다. –

+0

이것은 내가 달성하고 싶었던 것, 감사합니다!에 가장 가깝습니다! – stepelu

2

문제는 컴파일시에 cstr을 모른다는 것입니다.

int i = function_call(); 
const char* cstr = NULL; 

if(i > 0) 
{ 
    cstr = "hello"; 
} 
else 
{ 
    cstr = "ciaooo"; 
} 

위의 예를 고려하십시오. 컴파일러는 런타임 때까지 어떤 값 const char* cstr을 가정하지 않습니다.

기본적으로 나는 당신이 컴파일 타임에 그런 수표를 만들 수 없다고 말할 것이다.

const으로 선언되었지만 이것이 변수 cstr이 상수라는 것을 의미하지는 않습니다. 포인터 유형은 const입니다. 다음과 같이 읽어야합니다 : (const char)* cstr.

const char * const CONSTANT = "test"; 

새로운 할당이 컴파일시에 실패합니다 : 이것은 당신이 이러한 작업 cstr[0] = 's';

순수 상수는 다음과 같이 선언 할을 수행 할 수 없음을 의미합니다. 이 방법을 사용해도 컴파일 타임에 상수의 내용을 평가할 가능성은 없다고 생각합니다.

+0

이것은 의미가 있습니다. 이것을 지적 해 주셔서 감사합니다! – stepelu

2

나는 그렇게 생각하지 않는다. 가능하다면, 컴파일러는 어떻게 컴파일 타임에 이것을 체크 할 것인가?

const char* cstr3 = some_dynamic_function(); 

check(cstr3); 
1

마음에 드는 문자열 리터럴을 검사하는 스크립트를 작성하고 그 중 하나에 공백이 있으면 오류가 발생합니다.

빌드 프로세스 중에이 스크립트를 실행하십시오.

빌드 프로세스의 성공 여부는 스크립트 성공 여부에 따라 결정하십시오.

관련 문제