C 17의 부분 클래스 템플릿 인수 추론
C 17 기능인 "클래스 템플릿 인수 추론"(CTAD)을 사용하면 컴파일러가 자동으로 추론할 수 있습니다. 인스턴스화될 때 클래스의 템플릿 인수입니다. 이렇게 하면 코드가 단순화되고 명시적인 템플릿 인수를 지정할 필요가 없습니다.
그러나 템플릿 인수를 부분적으로 지정하고 나머지는 추론할 수 있습니까?
시도한 해결 방법 1:
부분 공제를 달성하기 위한 한 가지 시도는 다음과 같이 별칭 템플릿을 만드는 것입니다.
<code class="cpp">template<class T, class U> using Base2 = Base<T, U, double>;</code>
그런 다음 별칭을 사용하여 인수를 부분적으로 지정합니다.
<code class="cpp">void func() { Base2 val(1, 2); }</code>
그러나 이로 인해 별칭 템플릿을 사용하려면 전체 템플릿 인수 목록이 필요함을 나타내는 컴파일 오류가 발생합니다.
해결 방법:
안타깝게도 부분 공제는 다음에서 직접 지원되지 않습니다. C 17. 그러나 다음과 같은 몇 가지 해결 방법이 있습니다.
1. 오버로드 도우미 함수:
지정된 다양한 인수 집합으로 오버로드 함수를 만들고 추론에 가장 구체적인 오버로드를 사용합니다.
<code class="cpp">template<class T, class U> void func(Base<T, U> val) { } template<class T> void func(Base<T, double> val) { } template<> void func(Base<double> val) { }</code>
2. 명시적 인수 추론:
다른 인수를 추론하는 동안 특정 인수를 지정하려면 명시적 템플릿 인수 추론을 사용하세요.
<code class="cpp">Base val(1, static_cast<double>(4.), false);</code>
3. 가변 템플릿 활용:
여러 인수를 허용하고 템플릿 인수를 추론할 수 있는 가변 템플릿 생성:
<code class="cpp">template<typename... Args> class Base { public: Base(Args&&... args) { // Custom logic to deduce template arguments from args... } };</code>
결론:
C 17에서는 부분 클래스 템플릿 인수 추론이 직접 지원되지 않습니다. 그러나 함수 오버로딩, 명시적 추론 또는 가변 템플릿과 같은 해결 방법을 사용하면 유사한 효과를 얻을 수 있습니다.
위 내용은 ## C 17의 클래스 템플릿에 대한 템플릿 인수를 부분적으로 추론할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!