는 다음과 같은 템플릿 함수를 고려 다른 컨테이너에서 smart_pointer를 분별하기 specilization을 호출하여 올바른 함수가 호출되도록합니다. 다음 운전 코드는 예상대로 작동 : 이제템플릿 기능은
vector<int> v {1,2};
DoSomething(v);
우리는 우리가 컴파일 오류를 얻을 : 우리가 이것을 시도하는 경우
는char r('r');
DoSomething(r);
DoSomething(&r);
shared_ptr<char> s(new char ('s'));
unique_ptr<char> u(new char ('u'));
DoSomething(s);
DoSomething(u);
그러나, 어떤 일이 발생하는 지 생각해 봅시다. 컴파일러가 사용하기로 결정한 DoSomething의 버전은 네 번째 버전입니다. 이 안에서 우리는 벡터에없는 get() 함수를 참조합니다. 컴파일러가 어떻게 든 DoSomething의 첫 번째 정의를 선택한다면 컴파일이 잘되고 의도대로 작동합니다.
템플릿 템플릿 매개 변수에 get() 메서드가 포함되어있을 때만 3 번째 및 4 번째 전문화가 일치하도록 제한 할 수 있습니까? 어쩌면 특성, SFINAE 또는 다른 고급 템플릿 기술을 사용하여 이런 일이 발생할 수있는 방법이 있습니까?
여기에가는 전형적인 방법은 SFINAE입니다. – leemes