2015-01-24 5 views

답변

5

템플릿 클래스와 함수는 정확한 일치와 일치하므로 char*const char*는 다른 유형이기 때문에 귀하의 경우, Foo<char*>는 일반 참조합니다. 때때로 참조가 유형 : const char*&에 추가되기 때문에 함수에 대해 더 혼란 스럽습니다.

일종의 복잡 포인터 변형을 허용하는 클래스 템플릿을 만들지 만, 종종 더 많거나 적은 다음과 같이 작동합니다 :

template <typename T, typename allowed=void> class Foo { /* ... */ }; 

template <typename T> 
class Foo<T, typename std::enable_if<std::is_same<T, char*>::value || 
          std::is_same<T, const char*>::value 
          >::type> { /* ... */ }; 

당신이 무슨 일을하는지에 따라, 당신은뿐만 아니라 std::remove_reference<T>이 필요할 수 있습니다.

+0

가능한 동급 유형마다 전문화를 만들어야합니까? – Matt

+0

@Matt : 아니요, 부분 전문화를 사용하여 여러 유형을 처리 할 수 ​​있습니다. generic에'typename = void'를 가진 두번째 템플릿 매개 변수를 추가하면,'typename std :: enable_if :: value || partial specialization에서 std :: is_same :: value> :: type'을 호출합니다. –

+1

실제로, [' "B"'] (http://coliru.stacked-crooked.com/a/817bc782013ebfa1)를 인쇄합니다. 'thing'을'char *'로 만들겠습니까? –

관련 문제