템플릿의 멤버 전문화
템플릿 클래스의 특정 멤버를 부분적으로 전문화하는 것은 불가능합니다. 부분 특수화는 모든 템플릿 인수를 제공해야 합니다. 그러나 유사한 기능을 달성하기 위한 대체 접근 방식이 있습니다.
오버로드된 함수
한 가지 해결 방법은 템플릿 클래스 내에 오버로드된 함수를 도입하는 것입니다. 이는 특수화된 멤버 함수와 마찬가지로 멤버 변수 및 함수에 대한 동일한 액세스를 제공합니다.
<code class="cpp">template <typename T, bool B> struct X { void Specialized(); }; template <typename T> void X<T, true>::Specialized() { // True-specialized implementation } template <typename T> void X<T, false>::Specialized() { // False-specialized implementation }</code>
템플릿 매개변수를 사용한 함수 오버로딩
또 다른 옵션은 특수화 매개변수를 다음과 같이 전달하는 것입니다. 구조체에 래핑된 템플릿 매개변수를 사용하는 추가 함수 인수.
<code class="cpp">template <typename T, bool B> struct X { void Specialized() { SpecializedImpl(i2t<B>()); } private: void SpecializedImpl(i2t<true>) { // True-specialized implementation } void SpecializedImpl(i2t<false>) { // False-specialized implementation } };</code>
특수화를 위한 별도의 클래스 템플릿
특수 동작도 별도의 클래스 템플릿에서 구현할 수 있습니다. 그리고 기본 템플릿 클래스 내에서 호출됩니다.
<code class="cpp">template <typename T, bool B> struct SpecializedImpl { static void call() { // True- or false-specialized implementation } }; template <typename T, bool B> struct X { void Specialized() { SpecializedImpl<T, B>::call(); } };</code>
특수화를 위한 중첩 템플릿 클래스
특수 동작은 기본 템플릿 클래스 내에 템플릿 클래스로 중첩될 수 있습니다. .
<code class="cpp">template <typename T, bool B> struct X { private: template <bool B> struct SpecializedImpl { }; public: void Specialized() { SpecializedImpl<B>::call(); } private: template <> struct SpecializedImpl<true> { static void call() { // True-specialized implementation } }; template <> struct SpecializedImpl<false> { static void call() { // False-specialized implementation } }; };</code>
위 내용은 C 템플릿에서 회원 전문화를 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!