【C++】print関数の作り方【coutをラップした万能出力関数】


C++でオーバーロードや可変長引数に対応した万能print関数を作ります。これでstd::cout << 9 << std::endl;の面倒な記述ともおさらばです。

// clang++ -std=c++11 print.cpp
#include <iostream>

void print() { std::cout << std::endl; }
template<class T, class...A> void print(const T& first, const A&... rest) { std::cout << first; print(rest...); }
template<class...A> void print(const A&... rest) { print(rest...); }

int main(int argc, char *argv[]) {
  print();              // "\n"
  print("a");           // "a\n"
  print("b", "c");      // "bc\n"
  print("d", "e", "f"); // "def\n"
  print('C', 99);       // "C99\n"
  print(3.14);          // "3.14\n"
}

std::coutをラップしているため様々な型に対応できます。

スポンサーリンク

独自クラスに対応

独自クラスの出力に対応したい場合は、以下の手順で<<演算子をオーバーロードします。

class A {
  int a = 2, b = 9;
  friend std::ostream& operator<<(std::ostream& os, const A& it) {
    return os << it.a + it.b;
  }
};
print("C", A()); // "C11\n"

カンマ区切り

カンマ区切りが欲しい場合は以下のコードも合わせてご利用ください。

void prints() { std::cout << std::endl; }
template<class T> void prints(const T& first) { std::cout << first << std::endl; }
template<class T, class...A> void prints(const T& first, const A&... rest) { std::cout << first; prints(rest...); }
prints("a");           // "a\n"
prints("b", "c");      // "b, c\n"
prints("d", "e", "f"); // "d, e, f\n"
prints('C', 99);       // "C, 99\n"
prints(3.14);          // "3.14\n"
prints();              // "\n"

広告

関連するオススメの記事