부분 특수화
템플릿 패턴 특수화하기
부분 특수화은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
부분 특수화란 무엇인가요
부분 특수화는 정확히 하나의 유형이 아니라 공통된 패턴을 공유하는 유형의 군에 맞게 템플릿을 사용자 지정합니다.
- 클래스 템플릿만 지원합니다.
- 일부 매개변수는 여전히 제네릭으로 남겨 둡니다.
#include <iostream>
template <typename T>
struct Traits { static const char* kind() { return "value"; } };
template <typename T>
struct Traits<T*> { static const char* kind() { return "pointer"; } };
int main() {
std::cout << Traits<int>::kind() << '\n';
std::cout << Traits<int*>::kind() << '\n';
return 0;
}포인터 일치시키기
T* 패턴은 모든 포인터 유형에 일치하므로, 하나의 특수화로 모든 포인터를 처리할 수 있습니다.
#include <iostream>
template <typename T>
struct Deref { static T get(T v) { return v; } };
template <typename T>
struct Deref<T*> { static T get(T* p) { return *p; } };
int main() {
int x = 42;
std::cout << Deref<int>::get(7) << '\n';
std::cout << Deref<int*>::get(&x) << '\n';
return 0;
}함수는 부분 특수화할 수 없습니다
클래스 템플릿과 변수 템플릿만 부분 특수화를 지원합니다. 함수에는 대신 오버로딩을 사용합니다.
#include <iostream>
template <typename T>
void show(T) { std::cout << "value\n"; }
template <typename T>
void show(T*) { std::cout << "pointer\n"; }
int main() {
int x = 0;
show(5);
show(&x);
return 0;
}두 매개변수 중 하나 특수화하기
여러 유형 매개변수가 있을 때 하나는 고정하고 다른 하나는 열어 둔 채, 유형 전반의 패턴에 일치시킬 수 있습니다.
#include <iostream>
template <typename A, typename B>
struct Pair { static const char* kind() { return "mixed"; } };
template <typename A>
struct Pair<A, A> { static const char* kind() { return "same types"; } };
int main() {
std::cout << Pair<int, double>::kind() << '\n';
std::cout << Pair<int, int>::kind() << '\n';
return 0;
}배열 일치시키기
요소 유형과 크기를 비형식 매개변수로 추출하는 패턴을 사용해 배열 유형에 일치시킬 수 있습니다.
#include <iostream>
template <typename T>
struct Info { static int size() { return 1; } };
template <typename T, int N>
struct Info<T[N]> { static int size() { return N; } };
int main() {
std::cout << Info<int>::size() << '\n';
std::cout << Info<int[5]>::size() << '\n';
return 0;
}const 패턴
const T를 패턴으로 일치시키면 특수화에서 const를 제거하거나 감지할 수 있습니다.
#include <iostream>
template <typename T>
struct IsConst { static const bool value = false; };
template <typename T>
struct IsConst<const T> { static const bool value = true; };
int main() {
std::cout << std::boolalpha;
std::cout << IsConst<int>::value << '\n';
std::cout << IsConst<const int>::value << '\n';
return 0;
}가장 구체적인 특수화 선택
여러 특수화가 일치할 수 있을 때 컴파일러는 가장 구체적인 특수화, 즉 가장 구체적인 패턴을 선택합니다.
#include <iostream>
template <typename T>
struct K { static int v() { return 0; } };
template <typename T>
struct K<T*> { static int v() { return 1; } };
template <>
struct K<int*> { static int v() { return 2; } };
int main() {
std::cout << K<double*>::v() << ' ' << K<int*>::v() << '\n';
return 0;
}참조 패턴
참조 유형에도 일치시킬 수 있으므로, 참조와 일반 값을 구분할 수 있습니다.
#include <iostream>
template <typename T>
struct Cat { static const char* k() { return "value"; } };
template <typename T>
struct Cat<T&> { static const char* k() { return "lvalue ref"; } };
int main() {
std::cout << Cat<int>::k() << '\n';
std::cout << Cat<int&>::k() << '\n';
return 0;
}유형 특성 만들기
부분 특수화는 유형 특성의 기반이 됩니다. 다음은 직접 작성한 remove_pointer입니다.
#include <iostream>
#include <type_traits>
template <typename T>
struct RemovePtr { using type = T; };
template <typename T>
struct RemovePtr<T*> { using type = T; };
int main() {
std::cout << std::boolalpha;
std::cout << std::is_same<RemovePtr<int*>::type, int>::value << '\n';
return 0;
}패턴 결합하기
패턴을 조합할 수 있습니다. 예를 들어 const에 대한 포인터에 일치시켜 여러 겹으로 구성된 유형 구조를 처리할 수 있습니다.
#include <iostream>
template <typename T>
struct Desc { static const char* k() { return "plain"; } };
template <typename T>
struct Desc<const T*> { static const char* k() { return "ptr to const"; } };
int main() {
std::cout << Desc<int>::k() << '\n';
std::cout << Desc<const int*>::k() << '\n';
return 0;
}실용적인 컨테이너 특성
부분 특수화를 사용해 컨테이너와 유사한 템플릿의 요소 유형을 추출할 수 있습니다.
#include <iostream>
#include <type_traits>
template <typename C>
struct Element { using type = void; };
template <template <typename> class C, typename T>
struct Element<C<T>> { using type = T; };
template <typename T>
struct Box { T item; };
int main() {
std::cout << std::boolalpha;
std::cout << std::is_same<Element<Box<int>>::type, int>::value << '\n';
return 0;
}빠른 확인
부분 특수화에 대한 이해도를 확인해 보세요.
복습
부분 특수화에 대해 다음을 배웠습니다.
T*또는const T와 같은 유형의 패턴에 맞게 클래스 템플릿을 사용자 지정합니다.- 함수에는 부분 특수화가 아니라 오버로딩을 사용합니다.
- 일치하는 버전 중 가장 구체적인 버전을 선택합니다.
remove_pointer와 같은 유형 특성의 기반이 됩니다.
다음에는 유형이 조건을 충족할 때만 함수를 활성화하는 방법인 SFINAE를 배웁니다.
자주 묻는 질문
“부분 특수화” 강의는 무료인가요?
네 — “부분 특수화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“부분 특수화”에서 뭘 배우나요?
템플릿 패턴 특수화하기 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“부분 특수화” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 완전 특수화
- 부분 특수화
- SFINAE
- enable_if 패턴