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