2

複数のレイヤーを介して一部のコンテンツがベクターに追加される、次のことを検討してください。

class A {
public:
  void Add(Content c) {
    // Considerable amount of checking code here.
    v.push_back(c);
  }
private:
  std::vector<Content> v;
};

class B {
public:
  void Add(Content c) {
    // Considerable amount of additional code here.
    a.Add(c);
  }
private:
  A a;
};

class C {
public:
  void Add(Content c) {
    // Considerable amount of additional code here.
    b.Add(c);
  }
private:
  B b;
};

これは続けることができますが、ここで要点がわかります。コンテンツをコピーまたは移動、つまり push_back(const Content&) または push_back(Content&&) のいずれかで追加したい。呼び出し元は、次のいずれかを呼び出すことができる必要があります。

C c;
Content z;
c.Add(z);

また

c.Add(move(z));

最小限のコピーを取得します。

追加のコードを複製せずに、関数の追加テンプレート関数を作成せずにこれを達成する方法はありますか?

4

2 に答える 2

0

次の署名で 2 つのメソッドを追加できます。

void Add(Content && c);
void Add(Content & c);

他のオプションはユニバーサル リファレンスですが、そのためのテンプレートが必要です。

于 2013-10-12T15:58:38.327 に答える