C 17의 부분 템플릿 인수 추론
CTAD(클래스 템플릿 인수 추론)가 C 17에 도입되어 컴파일러가 자동으로 추론할 수 있습니다. 함수 인수 유형에 따른 템플릿 인수. 그러나 CTAD에서는 현재 모든 템플릿 인수를 추론하거나 명시적으로 지정해야 합니다. 템플릿 인수를 부분적으로 지정하고 나머지 인수를 추론하도록 할 수 있습니까?
다음 예를 고려하십시오.
<code class="cpp">template<class T, class U, class V> struct Base { constexpr Base(T, U) {} constexpr Base(T, U, V) {} constexpr Base(V) {} }; void func() { constexpr Base val(1, 4.0, false); }</code>
CTAD를 사용하면 컴파일러는 val에 Base< 유형이 있음을 올바르게 추론합니다. ;int, double, bool>. 그러나 다음 예와 같이 템플릿 인수를 부분적으로 지정하려면 어떻게 해야 할까요?
<code class="cpp"> constexpr Base<T = bool> val1(1, 4.0); // U & V deduced -> Base<int, double, bool> constexpr Base<T = bool, T = int> val2(5.0); // V deduced -> Base<bool, int, double></code>
안타깝게도 이 코드는 컴파일되지 않습니다. 컴파일러에서는 모든 템플릿 인수를 추론하거나 명시적으로 지정해야 하기 때문입니다. .
해결 방법
부분 CTAD는 직접 지원되지 않으므로 사용할 수 있는 몇 가지 해결 방법이 있습니다.
<code class="cpp">using NewBase2 = Base<double, int>; void func() { constexpr NewBase2 val(1, 2); }</code>
결론
부분 CTAD는 C 17에서 직접 지원되지 않지만 유사한 기능을 달성할 수 있는 해결 방법이 있습니다. 다가오는 C 20 표준에는 별칭 템플릿이 있는 CTAD에 대한 지원이 포함될 것으로 예상되지만 현재는 부분 CTAD 또는 상속된 생성자가 있는 CTAD에 대한 지원은 포함되지 않습니다.
위 내용은 ## C 17은 CTAD(클래스 템플릿 인수 추론)에서 템플릿 인수를 부분적으로 추론할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!