私はコンテナを反復処理するための2つのテンプレート関数を考えてみましょう:テンプレート名をメソッドにどのように渡しますか?
template <typename I, typename C>
It Prev(I i, const C& c) noexcept {
Expects(i != c.end());
if (i == c.begin()) return c.end();
return i - 1;
}
と
template <typename I, typename C>
It Next(I i, const C& c) noexcept {
Expects(i != c.end());
return i + 1;
}
そして、これらのテンプレートを使用GetNextElementとGetPrevElementを持つクラス:
struct MyClass {
std::vector<int> elements;
int* GetNextElement(std::vector<int>::iterator i) {
auto next = Next(i, elements);
if (next == elements.end()) return nullptr;
return &*it;
}
int* GetPrevElement(std::vector<int>::iterator i) {
auto prev = Prev(i, elements);
if (prev == elements.end()) return nullptr;
return &*it;
}
};
これらの2つのメソッドは、異なるテンプレートを呼び出す以外は同じことを行います。どのように私はその後
MyClass mc;
// ...
auto it = mc.elements.begin();
auto next = mc.GetElement<Next>(it);
// Or maybe mc.GetElement(it, Next);
'Next'と' Prev'がイテレータに関連付けられたコンテナへの参照を期待しています。 'GetElement'はコンテナを認識しません。あなたは 'std :: vector :: iterator'sを使用しているようですので、これを達成する方法はわかりません。 'GetElement'にコンテナを渡すか、' Next'と 'Prev'からその要件を削除する必要があります。 –
'Expects'が何であるかを定義していません。 'Prev'と' Next'の戻り値の型として 'It'を使いますが、宣言されていません。あなたがタイプ 'I'を使うことになったようです。 –
私の例ではあまりに単純化されているかもしれませんし、呼び出し側が気づかないことを公開しているかもしれません。呼び出し元は、要素がクラスにどのように格納されているのかわかりません。彼は要素に識別子を渡すことができ、 "GetNextElement"または "GetPrevElement"を呼び出すことができることを知っているだけです。これらの2つのメソッドはほぼ同じように、私は1つのメソッドを持つことができ、呼び出し側が希望する要素を取得するために、NextまたはPrevテンプレート関数を使用する必要があるかどうかを指定できます。 – Kian