C++で、後で取得する必要のある異なるデータ型メンバーを持つ派生クラス型を受け入れる最も洗練された方法を教えてください。下の例は、Containerクラスが、BaseItemの派生した変形の一種になるアイテムを「投稿」するメソッドを提供するところを示しています。後で私は、派生したItemを元に戻し、その値を抽出したいと思います。派生クラスがC++で異なるデータ型を運ぶ最も良い方法
私が欲しい主なことは、異なる "Item"派生型を定義して渡すことができるようにしながら、Containerインターフェイス(投稿と受信)が同じままであることです。テンプレートは何とかこれでいいですか?私はむしろRTTIを使用したくないでしょう。たぶん、これにはシンプルでエレガントな答えがあるかもしれませんが、今、私はそれを考えるのに苦労しています。
class ItemBase {
// common methods
};
class ItemInt : public ItemBase
{
private:
int dat;
public:
int get() { return dat; }
};
class ItemDouble : public ItemBase
{
private:
double dat;
public:
double get() { return dat; }
};
class Container {
public:
void post(int postHandle, ItemBase *e);
ItemBase* receive(int handle); // Returns the associated Item
};
int main()
{
ItemInt *ii = new IntItem(5);
Container c;
c.post(1, ii);
ItemInt *jj = c.receive(1);
int val = jj->get(); // want the value 5 out of the IntItem
}
Boost.anyを試してみましょう。 –
投稿されたコードには、各オブジェクトの 'get'が異なる戻り型を持つという問題があります。同じ種類にすることができない場合は、ストリングストリームなどを返す必要があります。 –
はい、同意しますが、get()関数は仮想関数ではありません。それぞれの派生クラスが「追加」するのは「別個の機能」です。継承を "必要な"ものにする他の一般的な機能があります –