"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C++에서 가상 템플릿 메서드를 사용하여 어떻게 다형성을 달성할 수 있나요?

C++에서 가상 템플릿 메서드를 사용하여 어떻게 다형성을 달성할 수 있나요?

2024-11-08에 게시됨
검색:535

How can you achieve polymorphism with virtual template methods in C  ?

C 가상 템플릿 방법

C에서는 정적 시간 다형성(템플릿)과 런타임 다형성을 결합하는 것이 어려울 수 있습니다. 이는 다음 추상 클래스에서 분명하게 나타납니다.

class AbstractComputation {
    public:
        template  virtual void setData(std::string id, T data);
        template  virtual T getData(std::string id);
};

이 클래스는 고유 식별자를 기반으로 지정된 유형의 데이터를 설정하고 검색하는 것을 목표로 합니다. 그러나 setData("foodouble", data)와 같은 특정 유형으로 일반 setData 함수를 호출하려고 하면 문제가 발생합니다.

컴파일러가 동적으로 처리해야 하기 때문에 언어는 이 구성을 금지합니다. 무한한 수의 템플릿 인스턴스화를 전달합니다. 이 문제를 해결하려면 다음과 같은 몇 가지 접근 방식이 가능합니다.

정적 다형성 제거:

  • 키-값을 저장하기 위해 별도의 유형을 도입하여 정적 다형성을 제거합니다. 매핑. 그런 다음 템플릿은 다형성이 필요 없이 기본 수준에서 이 문제를 해결할 수 있습니다.
class AbstractComputation {
public:
   template 
   void setData( std::string const & id, T value ) {
      m_store.setData( id, value );
   }
   template 
   T getData( std::string const & id ) const {
      return m_store.getData( id );
   }
protected:
   ValueStore m_store;
};

동적 다형성 제거:

  • 런타임 다형성은 유지하지만 유형 삭제를 통해 정적 다형성 제거:
  • 부스트 활용::any, 모든 유형의 데이터를 저장하기 위해 유형 삭제 기능을 제공합니다:
class AbstractComputation {
public:
   template 
   void setData( std::string const & id, T value ) {
      setDataImpl( id, boost::any( value ) );
   }
   template 
   T getData( std::string const & id ) const {
      boost::any res = getDataImpl( id );
      return boost::any_cast( res );
   }
protected:
   virtual void setDataImpl( std::string const & id, boost::any const & value ) = 0;
   virtual boost::any getDataImpl( std::string const & id ) const = 0;
};
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3