템플릿을 사용한 암시적 유형 변환
이 쿼리는 템플릿 클래스에서 암시적 유형 변환을 활성화하는 문제를 탐색합니다. 정수를 허용하는 생성자를 포함하는 템플릿 클래스 A의 경우를 생각해 보세요.
template <unsigned int m> class A { public: A(int); };
게다가 주어진 두 A 객체에 대해 A의 인스턴스를 반환하는 연산자 ''가 있습니다.
template<unsigned int m> A<m> operator+(const A<m>&, const A<m>&) { return A<m>(0); }
암시적으로 정수를 A 객체로 변환하려고 할 때 문제가 발생합니다. 예를 들어, 다음 코드는 이를 시도하지만 컴파일러에서 오류를 발생시킵니다.
A<3> a(4); A<3> b = a + 5; A<3> c = 5 + a;
해결책
해결책은 언어의 기능을 활용하는 데 있습니다. 클래스 정의 내에서 비멤버 친구 함수의 정의를 허용합니다. 템플릿의 경우 템플릿의 각 인스턴스화에 대해 컴파일러는 친구 선언에서 인스턴스화의 실제 유형을 대체하여 얻은 서명을 사용하여 무료 비템플릿 함수를 생성합니다.
template <typename T> class test { friend test operator+(test const &, test const &); // [1] }; test<int> t; // [2]
1], 컴파일러는 클래스 범위 내에서 friend 함수 정의를 허용합니다. 그런 다음 [2]에서 템플릿이 인스턴스화되면 컴파일러는 자유 함수를 생성합니다.
test<int> operator+(test<int> const &, test<int> const &) { return test<int>(); }
이 비템플릿 함수는 사용 여부에 관계없이 항상 정의됩니다.
암시적 변환의 마법
여기서 "마법"은 다음과 같습니다. 측면:
그러나 이 솔루션에는 제한 사항:
에도 불구하고 이러한 제한 사항이 있기 때문에 이 솔루션은 템플릿 클래스 내에서 암시적 변환을 가능하게 하는 우아한 방법을 제공하여 보다 유연하고 편리한 코드를 허용합니다.
위 내용은 템플릿 클래스에서 암시적 유형 변환을 활성화하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!