1

Barから派生したオブジェクトを格納するクラスがありますBarItem

#include <list>
#include <memory>

class Bar {
public:
    typedef std::shared_ptr<BarItem> item_ptr;

    void add_item(item_ptr item) {
        items_.push_back(item);
    }

private:
    std::list<item_ptr> items_;
};

Noteのサブクラスである別のクラスがありBarItemます。Note現在、私が行っているオブジェクトのコピーを追加するには、次のようにします。

Bar my_bar;
Note my_note;

my_bar.add_item(Bar::item_ptr(new Note(my_note)));

これは少し醜いです。これを自動化するためのより良い方法または方法があるかどうか知りたいですか?

4

3 に答える 3

1

コピーを実際に回避することはできませんが(C ++ 11では移動できます)、「自動化」できるためadd_item、各タイプ(の子である可能性がありますBarItem)の関数をオーバーロードすることで、いくつかのキーストロークを節約できます。

template <class T>
typedef enable_if<is_base_of<BarItem, T>::value,void>::type add_item(const T& item) { /* or T&& */
    items_.push_back(item_ptr(new T(item)));
}
于 2012-06-14T14:43:31.597 に答える
1

関数自体の醜い部分を次のように移動できます。

template<typename ItemType>
void add_item(ItemType item) //change the signature
{ 
    items_.push_back(new ItemType(item));  //add the copy!
}

そしてそれを次のように呼びます:

my_bar.add_item(my_note);
于 2012-06-14T14:38:57.310 に答える
0

コンテナでポインタを使用することは、オブジェクトのコピーを減らす1つの方法です。ただし、Noteオブジェクトの作成を処理する方法には、コピーコンストラクターを介してそのコピーを作成することが含まれます。

オブジェクトを持つことを避け、代わりにオブジェクトへのポインターを持つことができますか?これを行うには、作成を関数(工場)内に配置します。その関数はコンストラクターの引数を取り、オブジェクトを新しくし、スマートポインターを返します。

于 2012-06-14T14:43:29.477 に答える