あなたはこれを行うことができます:
は
template <typename T, unsigned int N>
std::ostream & operator<<(std::ostream & os, const T (&arr)[N])
{
// ..
return os;
}
もちろんこれは、コンパイル時のアレイにのみ動作します。 T
が組み込み型であるか、std
名前空間の型である場合、このテンプレートをインスタンス化することはできません。
N
ごとに別々のインスタンスを作成する可能性があるので、可能であれば、これをインラインにすることをお勧めします。 (pretty printerは、その一例があります。)os << "Hello"
は現在2つの可能なオーバーロードが持っているのであなたは、毛布のテンプレートは、あいまいさを紹介していること、しかし、気づくでしょう
:const char (&)[6]
テンプレートマッチング、および(非テンプレート)を過負荷のために両方とも同一の変換シーケンスを有する崩壊対ポインタconst char *
である。事実を考慮して
template <typename T, unsigned int N, typename CTy, typename CTr>
typename std::enable_if<!std::is_same<T, char>::value,
std::basic_ostream<CTy, CTr> &>::type
operator<<(std::basic_ostream<CTy, CTr> & os, const T (&arr)[N])
{
// ..
return os;
}
:
#include <ostream>
#include <type_traits>
template <typename T, unsigned int N>
typename std::enable_if<!std::is_same<T, char>::value, std::ostream &>::type
operator<<(std::ostream & os, const T (&arr)[N])
{
// ..
return os;
}
実際には、あなたもbasic_ostream
パラメータテンプレートパラメータを作ることができ、より一般的なこと:私たちは、char配列のための私達のオーバーロードを無効にすることでこの問題を解決することができますT
はユーザー定義の型でなければなりません。is_same<T, char>
をis_fundamental<T>
に置き換えることで、さらに多くのチェックを行うことができます(ユーザーは標準ライブラリタイプの配列に対してこれを使用してはいけません)。
感謝を(あなたがなど、ヒープ上に割り当て、すなわち配列)が、私ドン、それはまた、動的配列のために動作します。この方法では
ワンプラス:あなたは、次のようにそれを使用することができますインラインで実装されていない場合、Nごとに個別のインスタンス化を引き起こす理由を理解できませんか? – Alcott
まあ、それはテンプレートなので、すべてのテンプレートインスタンスはバイナリの別の関数として終わることがあります。インライン化すると、関数呼び出しを完全に回避することができますが、これは最終的にはコンパイラによるものです。 –
がそれを手に入れました。この演算子<< 2つのテンプレート引数を持つと、どのようにして2番目のarg Nを指定できますか?どうやら、私は単純に "cout << ar;"を使うことはできないのですか? – Alcott