0

この回答を参照して、2番目のコードブロック。私の質問は:

私が知っている場合は、 のみstd::lists<int>、および のみを処理し<int>ます。コメントで提案されているように、テンプレートを使用せずに、参照によってリストを渡さずに、これ (2 番目のブロックと 3 番目のブロック) を記述する方法はありますか? 見せていただけますか?

実装が単一の型しかカバーしていない場合、テンプレートの使用を避けるのは理にかなっていると思いますよね??? (または私は怠け者ですか?)

4

1 に答える 1

4

それが私の答えです!

std::back_insert_iterator<std::list<int> >テンプレートの有無にかかわらず、関数にa を渡すことができます。ひそかに、イテレータ自体がコンテナへの参照またはポインタを保持しているため、参照によってリストを渡しています。

typedef std::back_insert_iterator<std::list<int> > OutputIterator;

void getInts(OutputIterator out) {
    for (int i = 0; i < 10; ++i) {
        *(out++) = i;
    }
}

次に、呼び出し元は次のことを行います。

std::list<int> l;
getInts(std::back_inserter(l));

back_inserter関数テンプレートでありback_insert_iterator、クラステンプレートであるという意味で、まだ「テンプレートを使用」していますが、やはりそうですlist。この方法では、独自のテンプレートを作成する必要はありません。

1 つの型だけに関心がある場合は、テンプレートを避けることが必ずしも理にかなっているという意見には同意しません。C++ テンプレートの副作用は、テンプレートの引数演繹による型推論ですstd::back_insert_iterator<std::list<int> >。 typedef で一度でも。コードからわかるように、テンプレートを避けることは怠惰ではありません。型について言及する必要がないため、実際にはテンプレートを正確に記述するテキストが少なくなります。しかし、なんらかの理由で、その関数をリストでのみ機能し、それらの後ろに追加するだけで機能するように制限したい場合は、先に進むことができます。

于 2011-07-15T12:39:25.253 に答える