모든 타입에 같은 의미가 유지되면 기본 템플릿을 두고, 함수만 다르면 오버로딩을 먼저 봅니다. 클래스 구조 자체가 바뀔 때 특수화가 힘을 냅니다.
`T temp = a;`처럼 모든 타입에 같은 규칙을 적용합니다.
`const char*`처럼 더 자연스러운 함수 시그니처가 있으면 오버로드를 검토합니다.
타입 trait나 concept 결과에 따라 구현 일부만 바꿉니다.
`std::vector<bool>`처럼 자료구조 형태 자체가 바뀌는 경우입니다.
`char*`는 포인터와 문자열 내용의 소유권을 분리해서 봐야 합니다.
클래스 템플릿에서 포인터, 참조, 컨테이너 같은 패턴 단위로 적용합니다.
특수화가 많아지면 호출되는 구현을 추적하기 어려워집니다.