C의 유형 다형성: 가상 템플릿 방법
C 프로그래밍에서 가상 멤버 함수와 클래스 템플릿을 결합하는 것은 어려울 수 있습니다. 이러한 상황은 런타임 유형 정보를 기반으로 메서드를 동적으로 디스패치하면서 유형 안전 동작을 유지하려는 경우에 발생합니다.
문제
다음 추상 클래스와 파생된 구현:
<code class="cpp">class AbstractComputation { public: template <class T> virtual void setData(std::string id, T data) = 0; template <class T> virtual T getData(std::string id) = 0; }; class Computation : public AbstractComputation { public: template <class T> void setData(std::string id, T data); template <class T> T getData(std::string id, T data); };</code>
여기서의 의도는 setData
가능한 해결책
1. 정적 다형성 제거:
한 가지 접근 방식은 정적 다형성(템플릿)을 제거하고 키-값 쌍에 대한 일반 저장소를 도입하는 것입니다.
<code class="cpp">class ValueStore { template <typename T> void setData(std::string const & id, T value); template <typename T> T getData(std::string const & id) const; }; class AbstractComputation { public: template <typename T> void setData(std::string const & id, T value) { m_store.setData(id, value); } template <typename T> T getData(std::string const & id) const { return m_store.getData<T>(id); } protected: ValueStore m_store; };</code>
이 솔루션은 템플릿 전문화가 필요합니다.
2. 동적 다형성 제거:
또 다른 옵션은 런타임 다형성을 유지하지만 정적 다형성을 제거하는 것입니다.
<code class="cpp">class AbstractComputation { public: template <typename T> void setData( std::string const & id, T value ) { setDataImpl( id, boost::any( value ) ); } template <typename T> T getData( std::string const & id ) const { boost::any res = getDataImpl( id ); return boost::any_cast<T>( res ); } protected: virtual void setDataImpl( std::string const & id, boost::any const & value ) = 0; virtual boost::any getDataImpl( std::string const & id ) const = 0; };</code>
여기서 Boost::any를 사용하여 유형 삭제를 사용하면 비템플릿으로 디스패치를 허용합니다. 형식 안전성을 유지하면서 방법을 사용하세요.
위 내용은 C에서 가상 템플릿 방법을 사용하여 유형이 안전한 동적 디스패치를 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!