を導出I持って次のシナリオ:Accessのデータはテンプレートクラス
class ScalarField
{
void* _buffer; //Array for data.
};
と派生クラス:T
だけの基本的なタイプを想定することができ
template <typename T>
class ScalarFieldT : public ScalarField
{
ScalarFieldT(int size)
{
_data = new T[size];
_buffer = _data;
}
T& get(int index)
{
return _data[index];
}
T* _data; // Typed array for data
};
ていることに注意してくださいそのような浮動小数点、int、doubleなど。
これは非常に古いレガシーコードなので、適切な設計をして適切に調整する柔軟性はあまりありません。必要なことは、ScalarField::_buffer
から派生クラスの正しい型キャストを使用してデータにアクセスすることです。このような
何か:
void main()
{
int n = TOTAL_SIZE;
ScalarFieldT<int> typedScalarField(n);
ScalarField* scalarField = &typedScalarField;
// This is what I need to do:
int index = ELEMENT_INDEX;
float value = scalarField->method(index); // Get the value from base class correctly converted from int to float, for example.
}
ポイントは、私が唯一、基本クラスの抽象化へのアクセス権を持って、ですが、私は別の単純なデータ型は、そのようなフロート、intに変換_buffer
から値を取得する必要があり、 ucharなど
あなたは何をお勧めしますか?
ありがとうございます!
あなたは 'int'はその'メイン() 'の例では' float'としてキャストすることにしますか、またはあなたが 'という100%を確保していきますfloat value = scalarField-> get(index); '' ScalarFieldT 'としてインスタンス化されたscalarFieldで呼び出されますか? –
Frank
'static_cast'を使用してください。 –
'ScalarField *'があるところで、 '_buffer'が指し示す要素の実際の型を知っていますか?つまり、この特定のインスタンスが基本クラスのサブオブジェクトである 'ScalarFieldT'の 'T'を知っていますか?それがなければ、あなたは悲しいかなか幸運ではない、私は恐れている。 'ScalarField'だけを見ると、' _buffer'が 'int'の配列や' float'の配列を指しているのかどうかを知ることはできませんが、もちろん配列の実際のビットはこれらの2つのケースでは非常に異なった解釈をしています。 –