テンプレート化されたSTLコンテナを取得するために挿入演算子をオーバーロードできますか?

Itachi Uchiwa

この例はSTLコンテナーに関するものなので、それらについて読んでいます。range-forループを繰り返し使用してコンテナーのコンテンツを印刷するのは非常に面倒ですそこで、挿入演算子<<オーバーロードすることを考えたので、次のように書くことができますstd::cout << container << std::endl;

template<class T>
std::ostream& operator<<(std::ostream& out, const std::list<T>& v) {
    for (const auto& e : v)
        out << e << ", ";
    return out;
}

int main() {

    std::list<int> vi{ 10, 24, 81, 57, 2019 };

    vi.pop_back();
    std::cout << vi << std::endl; // 10, 24, 81, 57,

    std::deque<std::string> names{ "Hello", "STL Containers" };
    std::cout << names << std::endl; // error here. Bacause I've not overloaded << to take a std::deque<T>


}

上で見ることができるように、私listはあるタイプのを印刷するのとても快適だと思います問題は、リストを印刷することはできますが、vectorまたはのような他の種類のコンテナを印刷することはできないということdequeです...

では、どのようにオーバーロード<<してタイプのコンテナーを取得することができT<U>ますか、それともすべてのコンテナーに特化する必要がありますか?実際の例では、私はそれをすべきではありませんか?

ビビック

次のオーバーロードを提供できます。

template <class...>
using void_t = void;

template <class... Args>
constexpr bool exists_t_v(){
  return std::is_same<void_t<Args...>, void>::value;
}


template <class Container, class = std::enable_if<
  exists_t_v<
    decltype(std::begin(std::declval<Container>())),
    decltype(std::end(std::declval<Container>()))
  >()
>>
std::ostream& operator<<(std::ostream& os, Container&& container){
  for(const auto& e : std::forward<Container>(container))
    os << e << ',';

  return os;
}

これは、任意のインスタンスようになるcontainerタイプのContainerためにstd::begin(container)と、std::begin(container)オーバーロードを使用するように定義されています。

このようなソリューションの問題の1つは、std::stringサポートstd::begin()と、およびstd::end()が定義されている独自のオーバーロードをすでに提供しているタイプです

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

テンプレート化された演算子のオーバーロードを特殊化する方法は?

分類Dev

オーバーロードされテンプレート化された挿入演算子を使用して文字列オブジェクトの配列を表示しようとしたときに空白の出力を修正するにはどうすればよいですか?

分類Dev

コンテナでオーバーロードされた演算子を使用する

分類Dev

異なる引数セットを正しく処理する、特定の他のテンプレートのみを受け入れるためのテンプレートでのバイナリ演算子のオーバーロード

分類Dev

テンプレート化された構造体の<<演算子をオーバーライドする

分類Dev

演算子のオーバーロード==テンプレート化されたイテレータを使用する無料の関数

分類Dev

テンプレート化された演算子によるXOR演算子のオーバーロードが失敗する

分類Dev

テンプレートタイプを参照するための代入演算子には、非定数のオーバーロードが必要です

分類Dev

演算子<<のテンプレート化されたオーバーロードを明示的に呼び出す方法は?

分類Dev

スコープ解決演算子を使用すると、グローバル名前空間でオーバーロードされたテンプレートが呼び出されるのはなぜですか?

分類Dev

テンプレート関数を使用してベクトルに要素を追加するために<<演算子をオーバーロードする方法は?(c ++)

分類Dev

forループに「、」演算子が含まれる2つのライナーCソリューションが見つかりました。誰かが、指定されたコンマ演算子ステートメントを説明できますか?

分類Dev

条件演算子を使用しているときにテンプレート化された値または関数を再帰的に計算するときのエラーC1202(スタックオーバーフロー)

分類Dev

Djangoテンプレートで継承されたコンテナをオーバーライドするにはどうすればよいですか?

分類Dev

Djangoテンプレートで継承されたコンテナをオーバーライドするにはどうすればよいですか?

分類Dev

ポインターと構築されていないテンプレートオブジェクトを取得する演算子をオーバーロードできますか?

分類Dev

オーバーロードされた演算子 '[]'の使用は、テンプレートキャスト演算子ではあいまいです

分類Dev

jdbcテンプレートバッチ更新を使用してレコードを挿入または更新した後、自動生成された主キーを取得するにはどうすればよいですか?

分類Dev

テンプレート化された動的配列での演算子のオーバーロード[]

分類Dev

オーバーロードされた演算子のスコープは何ですか?クラスメンバーであるセットの挿入機能に影響しますか?

分類Dev

テンプレート化されたクラスで<<演算子をオーバーロードすると、リンカーエラーが発生します(C ++)

分類Dev

ネストされた列挙型のテンプレートパラメーターでオーバーロードするC ++フレンド演算子

分類Dev

コンテナに挿入されたばかりのオブジェクトのイテレータまたは参照を取得します

分類Dev

テンプレート化されたクラスで/演算子をオーバーロードしようとしたC ++エラー

分類Dev

テンプレートパラメータがそれを提供する場合、条件付きで比較演算子のオーバーロードを提供します

分類Dev

ハンドラーを挿入するために使用されるコンテキストを変更できますか?

分類Dev

汎用テンプレートを使用してクラスの演算子をオーバーロードするにはどうすればよいですか?

分類Dev

テンプレートクラスに演算子のオーバーロードを実装するにはどうすればよいですか?

分類Dev

スタックでカプセル化された3つのコンテナーを使用して、このようなレイアウトを取得しました。次に、ページをスクロールできるようにしますか?

Related 関連記事

  1. 1

    テンプレート化された演算子のオーバーロードを特殊化する方法は?

  2. 2

    オーバーロードされテンプレート化された挿入演算子を使用して文字列オブジェクトの配列を表示しようとしたときに空白の出力を修正するにはどうすればよいですか?

  3. 3

    コンテナでオーバーロードされた演算子を使用する

  4. 4

    異なる引数セットを正しく処理する、特定の他のテンプレートのみを受け入れるためのテンプレートでのバイナリ演算子のオーバーロード

  5. 5

    テンプレート化された構造体の<<演算子をオーバーライドする

  6. 6

    演算子のオーバーロード==テンプレート化されたイテレータを使用する無料の関数

  7. 7

    テンプレート化された演算子によるXOR演算子のオーバーロードが失敗する

  8. 8

    テンプレートタイプを参照するための代入演算子には、非定数のオーバーロードが必要です

  9. 9

    演算子<<のテンプレート化されたオーバーロードを明示的に呼び出す方法は?

  10. 10

    スコープ解決演算子を使用すると、グローバル名前空間でオーバーロードされたテンプレートが呼び出されるのはなぜですか?

  11. 11

    テンプレート関数を使用してベクトルに要素を追加するために<<演算子をオーバーロードする方法は?(c ++)

  12. 12

    forループに「、」演算子が含まれる2つのライナーCソリューションが見つかりました。誰かが、指定されたコンマ演算子ステートメントを説明できますか?

  13. 13

    条件演算子を使用しているときにテンプレート化された値または関数を再帰的に計算するときのエラーC1202(スタックオーバーフロー)

  14. 14

    Djangoテンプレートで継承されたコンテナをオーバーライドするにはどうすればよいですか?

  15. 15

    Djangoテンプレートで継承されたコンテナをオーバーライドするにはどうすればよいですか?

  16. 16

    ポインターと構築されていないテンプレートオブジェクトを取得する演算子をオーバーロードできますか?

  17. 17

    オーバーロードされた演算子 '[]'の使用は、テンプレートキャスト演算子ではあいまいです

  18. 18

    jdbcテンプレートバッチ更新を使用してレコードを挿入または更新した後、自動生成された主キーを取得するにはどうすればよいですか?

  19. 19

    テンプレート化された動的配列での演算子のオーバーロード[]

  20. 20

    オーバーロードされた演算子のスコープは何ですか?クラスメンバーであるセットの挿入機能に影響しますか?

  21. 21

    テンプレート化されたクラスで<<演算子をオーバーロードすると、リンカーエラーが発生します(C ++)

  22. 22

    ネストされた列挙型のテンプレートパラメーターでオーバーロードするC ++フレンド演算子

  23. 23

    コンテナに挿入されたばかりのオブジェクトのイテレータまたは参照を取得します

  24. 24

    テンプレート化されたクラスで/演算子をオーバーロードしようとしたC ++エラー

  25. 25

    テンプレートパラメータがそれを提供する場合、条件付きで比較演算子のオーバーロードを提供します

  26. 26

    ハンドラーを挿入するために使用されるコンテキストを変更できますか?

  27. 27

    汎用テンプレートを使用してクラスの演算子をオーバーロードするにはどうすればよいですか?

  28. 28

    テンプレートクラスに演算子のオーバーロードを実装するにはどうすればよいですか?

  29. 29

    スタックでカプセル化された3つのコンテナーを使用して、このようなレイアウトを取得しました。次に、ページをスクロールできるようにしますか?

ホットタグ

アーカイブ