首頁  >  文章  >  後端開發  >  如何使用 C 中的虛擬模板方法實現類型安全的動態調度?

如何使用 C 中的虛擬模板方法實現類型安全的動態調度?

Barbara Streisand
Barbara Streisand原創
2024-10-26 08:44:30251瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn