2016-09-09 1 views
0

사실 나는 C API를 사용하는 라이브러리로 프로젝트에서 작업 중이기 때문에 부분 char [] [심지어는 std::string 만 사용하고 싶습니다.]를 사용해야합니다.경계 체크가있는 char []의 안전한 템플릿을위한 특수 템플릿

어떻게 지금, 나는 템플릿이 문제를 잡으려고 한 수정 크기의char []에 너무 오래 char * 변수를 복사 할 때 문제가 발생하지 않도록하기 위해서이다.

하지만 불행히도 나는 전문성에 집착하고 있습니다. 이 프로젝트에서 우리는 대상 변수 유형 char [fixed-value]항상입니다을 가정 할 수 있으며char *이 아니어야합니다. 따라서 할당 된 크기 인 char *의 크기를 확실히 결정할 수있는 확실한 방법이 실제로 없기 때문에 중요합니다.

이것은 내가 그렇게 멀리 뭘하려 :

Wrong parameter <-- output for copyWithBoundaryCheck(wrongPtr, source, 10); 
Wrong parameter <-- output for copyWithBoundaryCheck(destination, source, sizeof(destination)); 

copyWithBoundaryCheck(destination, source, sizeof(destination));를 들어 I 출력 Correct parameter을 기대했지만, 난 항상 Wrong parameter가 나타납니다

#include <stdio.h> 

template <typename T> 
void copyWithBoundaryCheck(char destination [], char * source, int maximalSize) 
{ 
    printf("Correct parameter\n"); 
}; 

template <typename T> 
void copyWithBoundaryCheck(T, char * source, int maximalSize) 
{ 
    printf("Wrong parameter\n"); 
}; 

int main() 
{ 
    char * source = (char *) "Source"; 
    char * wrongPtr = (char *) malloc(20); 
    char destination [20]; 

    copyWithBoundaryCheck(wrongPtr, source, 10); 
    copyWithBoundaryCheck(destination, source, sizeof(destination)); 
} 

이 출력입니다.

내 질문 : 템플릿 기능의 전문화 copyWithBoundaryCheck 캐치char [numeric-value]로 구현 될 수있다 방법

? 내 예에 따르면 copyWithBoundaryCheck(destination, source, sizeof(destination));Correct parameter을 표시합니다.

+0

당신이'문자열 :: c_str'를 사용할 수없는 이유는? 또는 배열에'vector '을 사용 하시겠습니까? –

+0

템플릿을 찾고있을 수도 있습니다. copyWithBoundaryCheck (char (& destination) [N], ...);'오버로드 게임의 목적을 제대로 파악하지 못했습니다. 우선,'copyWithBoundaryCheck'의 첫 번째 오버로드는 'T'를 추론 할 수 없으므로 과부하 해결에서 실행 가능하지 않습니다. –

+0

이것은 C++에서 매우 자주 사용되는 추측과 매우 흡사합니다. 배열이 C++에서 어떻게 작동하는지 검토해야합니다. –

답변

4

당신은 아마 이런 식으로 뭔가를 찾고 있습니다 :

template <size_t N> 
void copyWithBoundaryCheck(char (&destination)[N]) 
{ 
    printf("Correct parameter of size %zu\n", N); 
}; 

Demo

+0

예 선생님! 완벽한 대답! 그 동안 여러 유형으로 테스트 할 수 있었고 정확히 내가 찾고 있던 것이 었습니다! Upvoted 및 허용! 정말 고마워! * 목적지 * 필드의 크기를 제공 할 필요가 없기 때문에 이제는 매우 우아합니다. 컴파일러에 의해 해결됩니다. 나는이 대답을 사랑한다! –