2013-03-28 3 views
3

함수 템플릿을 작성 중입니다. 단순화하려면 다음과 같이 말하십시오.C++ 템플릿 C- 문자열 매개 변수

template < typename T > 
void f(const T & x) 
{ 
    cout << "generic case" << endl; 
    cout << x << endl; 
} 

나는 항상 C- 문자열을 템플릿 매개 변수 인수로 사용할 수 없다고 생각했습니다. 그러나 (++ 4.5.1 g을 사용하여) 실제로 작동 다음

그래서 제 질문은
f("hello world"); 

: 나는 f("hello world")를 호출 할 때 T은 무엇인가?

정확히 무슨 일이 일어나고 있는지 전문적으로 분석하려고했습니다.

template < typename T > 
void f(const T & x) 
{ 
    cout << "generic case" << endl; 
    cout << x << endl; 
} 
template <> 
void f(const const char * T & x) 
{ 
    cout << "char[] case" << endl; 
    cout << x << endl; 
} 

을 여러 변화를 시도 : 예를 들어 char[] 이후는 (분명히 작동하지 않는)이 바라 보았다 const char*입니다. 그들 중 누구도 일하지 않습니다.

ASIDE : 내가하고있는 일에 정말로 필요하지 않습니다. 난 그냥 다른 템플릿 기능 썼다 있도록 T = "C-문자열"의 경우에 대한 전문성이 필요합니다

template < typename T > 
void f(const T & x) 
{ 
    cout << "generic case" << endl; 
    cout << x << endl; 
} 
template < typename T > 
void f(T x[]) 
{ 
    cout << "T[] case" << endl; 
    cout << x << endl; 
} 

정확히 무슨 일이 일어나고 있는지 나는에 관해서 궁금하기 때문에 난 그냥 부탁 해요 및 이유이다 C - 문자열은 템플릿 인자가 될 때 내가 읽었을 때 이 될 수 없다고 말했습니다. 나는 틀린 것에 대해 틀린/오해가 있었음에 틀림 없다.

+0

가능한 복제본 : http://stackoverflow.com/questions/6973040/specialize-a-void-function-template-to-a-const-charn –

답변

3

C 문자열 유형이 없습니다. C-string이라는 용어는 유형이 아닌 내용을 정의합니다. 어딘가에 널 문자가있는 문자 배열의 일부를 가리키며, 이는 일부 함수에 의해 문자열의 끝을 의미하는 것으로 해석됩니다.

정말로 관심있는 내용은 문자열 리터럴입니다. 문자열 리터럴의 유형은 const char[N]입니다. 여기서 N은 암시 적 널 종결자를 포함하여 문자열의 문자 수입니다. 따라서 "hello world"const char[12]입니다. 이처럼에 대한 전문 수 있습니다 : 이것은 단지 그러나 크기 (12)의 배열을 포함

template<> 
void f(const char(&x)[12]) 
{ 
    cout << "const char[12] case" << endl; 
    cout << x << endl; 
} 

하는 것으로, 당신은 오버로드 할 수 있습니다 (전문되지 않음)이 같은 f()에 대한 모든 크기 :

template<size_t N> 
void f(const char(&x)[N]) 
{ 
    cout << "const char[" << N << "] case" << endl; 
    cout << x << endl; 
} 

또한이 메서드는 일반적인 명명 된 배열도 포함합니다. 그것들과 문자열 리터럴을 구분할 방법이 없습니다. 이도 * 모두 추론 같이 CONST CHAR [N] 및 CONST 숯불 작동

0

참고 여기

template < typename T > 
void f(const T* x) 
{ 
    cout << "const char* case" << endl; 
    cout << x << endl; 
} 

특성화 상수 포인터 타입이다.

문자 배열 유형 또는 포인터 유형을 기반으로하는 특수화가 필요한 경우 간단한 함수 오버로드를 사용할 수도 있습니다.

관련 문제