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

템플릿 클래스에서 암시적 유형 변환을 활성화하려면 어떻게 해야 합니까?

DDD
풀어 주다: 2024-11-17 16:45:02
원래의
185명이 탐색했습니다.

How Can Implicit Type Conversion Be Enabled in Template Classes?

템플릿을 사용한 암시적 유형 변환

이 쿼리는 템플릿 클래스에서 암시적 유형 변환을 활성화하는 문제를 탐색합니다. 정수를 허용하는 생성자를 포함하는 템플릿 클래스 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>();
}
로그인 후 복사

이 비템플릿 함수는 사용 여부에 관계없이 항상 정의됩니다.

암시적 변환의 마법

여기서 "마법"은 다음과 같습니다. 측면:

  • 일반 정의: 비템플릿 함수는 인스턴스화된 각 유형에 대해 일반적으로 정의되어 일반성과 인수가 완벽하게 일치하지 않을 때 사용할 수 있는 기능을 모두 제공합니다.
  • 암시적 변환: 비템플릿 함수이므로 컴파일러는 암시적 변환을 호출할 수 있습니다. 두 인수 모두에서 예상되는 동작을 활성화합니다.
  • 인수 종속 조회: 함수는 인수 종속 조회를 통해서만 찾을 수 있습니다. 즉, 인수 중 하나 이상이 다음과 같은 경우에만 고려됩니다. 원하는 유형을 선택하세요.

그러나 이 솔루션에는 제한 사항:

  • ADL을 통해서만 액세스할 수 있으므로 함수의 가시성을 제한합니다.
  • 함수 포인터를 얻는 것을 방지합니다.

에도 불구하고 이러한 제한 사항이 있기 때문에 이 솔루션은 템플릿 클래스 내에서 암시적 변환을 가능하게 하는 우아한 방법을 제공하여 보다 유연하고 편리한 코드를 허용합니다.

위 내용은 템플릿 클래스에서 암시적 유형 변환을 활성화하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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