C 仮想テンプレート メソッド
C では、静的な時間ポリモーフィズム (テンプレート) と実行時ポリモーフィズムを組み合わせるのは難しい場合があります。これは、次の抽象クラスで明らかです。
class AbstractComputation {
public:
template virtual void setData(std::string id, T data);
template virtual T getData(std::string id);
};
このクラスは、一意の識別子に基づいて、指定されたタイプのデータを設定および取得することを目的としています。ただし、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;
};
動的ポリモーフィズムの削除:
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