C 가상 템플릿 메서드
제시된 시나리오에는 동적으로 설정하고 검색하기 위한 가상 템플릿 메서드인 setData 및 getData가 포함된 추상 클래스가 포함됩니다. 제공된 식별자를 기반으로 다양한 유형의 데이터. 그러나 질문에서 알 수 있듯이 이러한 구성은 C에서 직접 지원되지 않습니다.
이 제한을 해결하기 위해 두 가지 기본 접근 방식이 있습니다:
정적 다형성 제거
한 가지 옵션은 정적 다형성(템플릿)을 제거하고 중간 저장 메커니즘을 도입하는 것입니다. AbstractComputation 클래스는 식별자를 기반으로 데이터를 저장하고 검색하는 템플릿이 아닌 ValueStore를 정의할 수 있습니다.
<code class="cpp">class ValueStore { public: template <typename T> void setData(std::string const &id, T value) {...} template <typename T> T getData(std::string const &id) {...} }; 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); } private: ValueStore m_store; };</code>
그러면 파생 클래스는 런타임 다형성 없이도 ValueStore에 직접 액세스할 수 있습니다.
런타임 다형성 제거
또는 정적 다형성을 제거하면서 런타임 다형성을 유지할 수도 있습니다. 여기에는 기본 클래스에서 유형 삭제를 수행하는 작업이 포함됩니다.
<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는 모든 유형의 값을 저장할 수 있고 데이터를 안전하게 검색할 수 있는 유형입니다. 유형 삭제는 파생 클래스에서 구현되어야 하는 가상 메소드에 대한 인수로 Boost::any 객체를 전달하여 수행됩니다.
위 내용은 C에서 가상 템플릿 메소드를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!