C에서 클래스 생성자 내의 객체를 초기화할 때 명시적 템플릿 생성자를 어떻게 호출할 수 있나요? 다음 예를 고려하십시오.
struct T { template<class> T(); }; struct U { U() : t<void>() {} // This approach does not work T t; };
제공된 코드는 U의 이니셜라이저 목록 내에서 T의 템플릿 생성자를 명시적으로 호출하려고 시도합니다. 그러나 이 접근 방식은 실패합니다.
초기화 목록에서 템플릿 생성자를 명시적으로 호출하는 것은 C에서 지원되지 않습니다. 이러한 제한은 일반적으로 템플릿 인수가 꺾쇠 괄호를 사용하여 함수 템플릿 이름 뒤에 지정된다는 사실에서 비롯됩니다. 생성자에는 자체 이름이 없으므로 템플릿 인수를 생성자에게 전달하는 일반적인 방법이 없습니다.
C 표준은 섹션 14.8.1/7에서 이 제한 사항을 명시적으로 언급합니다.
[Note: because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates. ]
한 가지 해결 방법은 도우미 유형을 활용하여 템플릿 인수를 다음과 같이 전달하는 것입니다. 유형 ID를 허용하는 생성자에 대한 인수입니다. 예:
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
이 경우 Boost에 정의된 ID 템플릿을 사용하여 템플릿 인수를 래핑할 수 있습니다. 또는 C 20에서는 std::type_identity 유형을 사용할 수 있습니다.
위 내용은 C 이니셜라이저 목록에서 템플릿 생성자를 명시적으로 호출하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!