2014-10-01 2 views
6
#include <iostream> 
#include <ostream> 

template<typename T> 
void Func(const T& val) 
{ 
    std::cout << "const T& val\n"; 
} 

void Func(const char* p) 
{ 
    std::cout << "const char * p\n"; 
} 

void Func(std::ostream & (*manip)(std::ostream &)) 
{ 
    std::cout << "ostream\n"; 
} 

int main() 
{ 
    Func(std::endl); 
    Func("aaa"); 
} 

관측 :템플릿 기능이 매개 변수를 선택하는 방법은 무엇입니까?

1>void Func(std::ostream & (*manip)(std::ostream &))하지 않고는, 라인 Func(endl); 컴파일러 오류가 발생합니다. 나는이 문제가 템플릿 함수 void Fun(const T& val)의 경우에만 T 유형을 취할 수 있지만 함수 포인터 때문일 수 있다고 가정합니다.

2>void Func(const char* p)이 없으면 Func("aaa"); 행이 정상적으로 실행됩니다. 나는 그 이유가 T 타입이 const char* 일 수 있다고 생각합니다.

질문> 올바른 주장입니까?

+3

정말 재미라는 첫 번째 함수가 아니라 Func을을, 또는 오타이다? – happydave

+0

@happydave, 코드 및 질문을 수정했습니다. – q0987

+0

'const char *'오버로드가없는 두 번째 경우에서'T'는'char [4]'로 추론됩니다. –

답변

8

std::endl 함수 템플릿 자체 감사, 그래서 당신은 실제로 기능를 지정하지 않는 한 당신은 Func에 대한 템플릿 인수 공제를 가질 수 없습니다. 다음과 같은 작업을해야합니다 :

Func(static_cast<std::ostream&(&)(std::ostream&)>(std::endl)); 

또 다른 방법 (@ 0x499602D2 덕분에) 템플릿 인수를 지정하는 것입니다 :

Func(std::endl<char, std::char_traits<char>>); 
+0

캐스트 구문이 다음과 같은 이유가 무엇입니까? (std :: endl)); ' – q0987

+0

아니요, Kerrek는 명시 적으로'std :: endl'이 그 것이 아니라고 말했습니다. 실제로 대답을 준비 했습니까? 예를 들어 [this] (http://en.cppreference.com/w/cpp/io/manip/endl)를 참조하십시오. – Useless

+0

@Useless, 내 의견을 삭제했습니다. Thx – q0987

관련 문제