2010-06-10 2 views
0

: 내가 잘못 CONST와 const가 아닌 숯불 * 특히 두 가지 변종을하고있는 것 같은이 보이는여러 종류의 문자열을 전문으로하려면 여러 템플릿 전문화가 필요합니까? 예를 들어

template<typename T> 
void write(T value) 
{ 
    mystream << value; 
} 

template<> 
void write<const char*>(const char* value) 
{ 
    write_escaped(mystream, value); 
} 

template<> 
void write<char*>(char* value) 
{ 
    write_escaped(mystream, value); 
} 

template<> 
void write<const std::string&>(const std::string& value) 
{ 
    write_escaped(mystream.c_str(), value); 
} 

.

char something[25]; 
strcpy(something, "blah"); 
write(something); 

은 무엇 이렇게 적절한 방법이 될 것이다 : 그러나 나는 VC++ (10)이 같은 전화했을 때 난 단지, 다음 char * 변수가 아닌 전문 버전을 호출합니다 통과 const char *에 대한 전문 경우 있음을 확인?

+2

전문화 대신 단순한 과부하를 사용하십시오. – avakar

+0

그리고 nitpick, string (avakar가 과부하로 더 좋을 것이라고 말함)의 전문화는 const 참조를 취해야합니다. –

+0

OK, 과부하에 대해 좋은 점. 어떤 인터넷 검색은 그것이 왜 더 좋은지에 대한 다양한 이유를 보여줍니다. 또한 const 문자열 &로 수정됩니다. –

답변

1

당신은 적절한 방법을 사용했습니다.

char *const char *은 각각 고유 한 전문화가 필요합니다.

+1

"필요합니다"는 약간 강할 수 있습니다 - 다른 대체 오버레이가있을 경우 별도의 오버레이/지정이 필요합니다/특수화를 사용할 수 있습니다. –

1

C++ 컴파일러는 형식 T를 처리하고 const T를 다른 데이터 형식으로 처리합니다. 템플릿은 데이터 형식 사양에서 작동하기 때문에. 각 명시 적 데이터 유형에 대한 명시 적 정의를 작성해야합니다.

0

std :: stringstream이 이미이 모든 유형을 처리하고 있다고 가정 할 때, 왜 당신이 그들을 전문화해야합니까?

그 외에도 C++ 개발자는 const char *를 처리 할 필요가 없습니다. 또는 memcpy를 사용하십시오. 그냥 std :: string을 만드십시오. 그리고 std :: string에 대한 const 참조를 가져옵니다. 진지하게, 여기에 C를 써 주려고하는거야?

+0

a) stringstream이 문자열을 읽는 방법을 제공하지 않기 때문에 특별히 처리해야하는 문자열을 원하기 때문에 [내가 아는] 공백이 있으면 쓴 문자열을 다시 읽을 수 있습니다. b) 실수로 문자열 리터럴 주위에 "std :: string()"을 추가하는 것을 잊어서 버그를 도입하고 싶지 않기 때문에. –

+0

memcpy와 stuff : C API를 사용하는 C++ 코드를 작성할 때조차도? (어느 쪽인지) –

+0

쓴 문자열을 다시 읽고 싶다면 원래의 문자열을 유지하는 것이 어떻습니까? memcpy에 관해서, 당신이 준 예제 (strcpy의)는 여전히 가증스러운 것입니다. 고정 크기 버퍼가 오버플로를 기다리고 있습니다. 어쨌든 Strcpy는 안전하지 않습니다. char [] buffer = "lols"를 사용하지 않는 이유는 무엇입니까? 그리고, 당신이 객체를 생성하는 것을 기억하지 못한다면, 컴파일 타임 오류가 발생하기 쉽고, const char *의 가증성에 대한 std :: string의 안전성을 고려해 볼 때 가치가 있습니다. – Puppy