> 백엔드 개발 > C++ > C가 템플릿 공분산을 지원하지 않는 이유는 무엇이며, 다형성 템플릿으로 작업할 때 발생하는 유형 안전성 문제를 어떻게 해결할 수 있습니까?

C가 템플릿 공분산을 지원하지 않는 이유는 무엇이며, 다형성 템플릿으로 작업할 때 발생하는 유형 안전성 문제를 어떻게 해결할 수 있습니까?

Patricia Arquette
풀어 주다: 2024-10-28 08:14:02
원래의
577명이 탐색했습니다.

Why doesn't C   support template covariance, and how can we address the resulting type safety issues when working with polymorphic templates?

C의 템플릿 및 다형성

다음 클래스 구조를 고려하세요.

<code class="cpp">class Interface {
  // ...
};

class Foo : public Interface {
  // ...
};

template <class T>
class Container {
  // ...
};</code>
로그인 후 복사

다른 클래스의 생성자 Bar는 다음과 같이 정의됩니다.

<code class="cpp">Bar(const Container<Interface>& bar) {
  // ...
}</code>
로그인 후 복사

그러나 다음과 같이 생성자를 호출하려고 하면

<code class="cpp">Container<Foo> container();

Bar *temp = new Bar(container);</code>
로그인 후 복사

"일치하는 함수 없음" 오류가 발생합니다.

템플릿의 다형성

템플릿의 다형성 개념 또는 템플릿 공분산은 클래스 B가 클래스 A에서 상속되면 T 마찬가지로 T로부터 상속받습니다. 그러나 C나 Java나 C#과 같은 다른 언어에서는 그렇지 않습니다.

템플릿 공분산이 부족한 이유

템플릿 공분산이 없다는 것은 다음과 같이 정당화됩니다. 유형 안전성을 유지해야 합니다. 다음 예를 고려하십시오.

<code class="cpp">// Class hierarchy
class Fruit {...};
class Apple : public Fruit {...};
class Orange : public Fruit {...};

// Template instantiation using std::vector
int main() {
  std::vector<Apple> apple_vec;
  apple_vec.push_back(Apple()); // Valid

  // With covariance, the following would be allowed
  std::vector<Fruit>& fruit_vec = apple_vec;

  // Adding an Orange to the vector
  fruit_vec.push_back(Orange());

  // Incorrect addition of an orange to an apple vector
}</code>
로그인 후 복사

이는 템플릿이 공변적일 경우 안전하지 않은 동작이 발생할 가능성을 보여줍니다. 따라서 T 및 T A와 B의 관계에 관계없이 완전히 다른 유형으로 간주됩니다.

문제 해결

Java 및 C#에서 문제를 해결하는 한 가지 접근 방식은 경계를 사용하는 것입니다. 와일드카드 및 제약 조건은 각각

<code class="java">Bar(Container<? extends Interface) {...}
로그인 후 복사
<code class="csharp">Bar<T>(Container<T> container) where T : Interface {...}</code>
로그인 후 복사

C에서 Boost Concept Check 라이브러리가 유사한 기능을 제공할 수 있습니다. 그러나 발생한 특정 문제에 대해서는 간단한 정적 어설션을 사용하는 것이 더 실용적인 솔루션일 수 있습니다.

<code class="cpp">static_assert(std::is_base_of<Interface, Foo>::value, "Container must hold objects of type Interface or its derived classes.");</code>
로그인 후 복사

위 내용은 C가 템플릿 공분산을 지원하지 않는 이유는 무엇이며, 다형성 템플릿으로 작업할 때 발생하는 유형 안전성 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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