0

コンテナの最初と最後の要素を引数として取り、STLアルゴリズムが機能するように、要素のシーケンスを操作する演算子<<を定義したいと思います。引数を1つだけ取るのとは対照的に、コンテナ自体、たとえば

std::ostream& operator<< ( std::ostream &out, std::list inList );

そのため、list、vector、arrayなどを使用しているかどうかに関係なく機能する関数を1つだけ作成する必要があります。また、inList.begin()とinList.end()の2つの引数を使用して関数を呼び出す必要があります。

問題は、operator<<が引数を1つだけ取るということです。これを克服するための最良の方法は何ですか?

編集:あなたの答えをありがとう。おそらく、コンテナのサブシーケンス(STLアルゴリズムのように)を含む、さまざまな要素を印刷する機能が必要であることをより明確にしたほうがよいでしょう。たとえば、ベクトルvに5つの要素がある場合、次のような出力でv.begin()からv.end()までのシーケンスを与えるすべての要素を出力できます。

[element1 element2 element3 element4 element5]

ただし、[v.begin()、v.begin()+ 3)の範囲で最初の3つだけを印刷できればいいのですが。

[element1 element2 element3]

この場合、提案された回答は機能しますか?

4

3 に答える 3

2

1つの引数を渡すことから逃れることはできませんが、あらゆる種類のコンテナーで機能するものが必要です。したがって、理想的には、次のような関数が必要になります

template <typename T>
std::ostream& someFunction(std::ostream& out, T first, T last) {
  // do your stuff
}

とのようなものostream& operator<<を探しています

template <T>
std::ostream& << (std::ostream& out, const T& sequence) {
  return someFunction(out, sequence.begin(), sequence.end());
}

ただし、この演算子は事前定義された演算子と衝突するため、そのように実装することはできません。幸い、テンプレートマジックをプレイしてこれを回避できます。非常に優れた解決策を確認するには、このSOの質問と対応するgithubプロジェクトを確認してください。

(おそらく)目的はostream& operator<<コンテナーのジェネリックを作成することであり、これは関数テンプレートを介して実現するため、関数にイテレーターを使用させる必要はないことに注意してください。コンテナへの(定数)参照を取得することもできます。

于 2012-06-01T14:40:06.307 に答える
1

引数を 1 つだけ渡し、メソッド内でbeginandを受け取ります。endすべての std コンテナには と がbeginありendます。いいえ、パラメータの数を に変更することはできませんoperator <<

于 2012-06-01T14:31:38.510 に答える
1

これは古い質問ですが、最近同じ問題に対処する必要があったため、ここに解決策を投稿すると思いました。Range と makeRange は std::pair と std::make_pair の機能を複製しますが、競合を避けるために前者を追加しました (他のタイプのペアは異なる方法で出力される場合があります)。

#include <iostream>

using namespace std;

template <typename Iterator>
struct Range
{
  Range();
  Range(Iterator begin_, Iterator end_) : begin(begin_), end(end_) {}

  Iterator begin, end;
};

template <typename Iterator>
Range<Iterator>
makeRange(Iterator begin, Iterator end)
{
  return Range<Iterator>(begin, end);
}

template <typename InputIterator>
ostream &
operator<<(ostream & out, Range<InputIterator> const & range)
{
  for (InputIterator iter = range.begin; iter != range.end; ++iter)
  {
    if (iter != range.begin) out << ", ";  // adjust formatting to taste
    out << *iter;
  }

  return out;
}

int
main(int argc, char * argv[])
{
  int a[] = { 1, 2, 3, 4, 5 };
  cout << makeRange(a, a + 2) << endl;  // prints 1, 2
}
于 2016-04-26T04:33:47.740 に答える