사실 나는 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
을 표시합니다.
당신이'문자열 :: c_str'를 사용할 수없는 이유는? 또는 배열에'vector'을 사용 하시겠습니까? –
템플릿을 찾고있을 수도 있습니다. copyWithBoundaryCheck (char (& destination) [N], ...);'오버로드 게임의 목적을 제대로 파악하지 못했습니다. 우선,'copyWithBoundaryCheck'의 첫 번째 오버로드는 'T'를 추론 할 수 없으므로 과부하 해결에서 실행 가능하지 않습니다. –
이것은 C++에서 매우 자주 사용되는 추측과 매우 흡사합니다. 배열이 C++에서 어떻게 작동하는지 검토해야합니다. –