> 백엔드 개발 > C++ > 본문

## C 17은 CTAD(클래스 템플릿 인수 추론)에서 템플릿 인수를 부분적으로 추론할 수 있습니까?

Susan Sarandon
풀어 주다: 2024-10-25 07:23:02
원래의
199명이 탐색했습니다.

## Can C  17 Partially Deduce Template Arguments in Class Template Argument Deduction (CTAD)?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!