> 백엔드 개발 > C++ > C에서 가상 템플릿 방법을 사용하여 유형이 안전한 동적 디스패치를 ​​달성하는 방법은 무엇입니까?

C에서 가상 템플릿 방법을 사용하여 유형이 안전한 동적 디스패치를 ​​달성하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-26 08:44:30
원래의
311명이 탐색했습니다.

How to Achieve Type-Safe Dynamic Dispatch with Virtual Template Methods in C  ?

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("foodouble", data)를 호출하여 foodouble로 식별된 double을 data 값으로 설정하는 것입니다.

가능한 해결책

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

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