2016-03-19 15 views
0

配列の内容を出力オブジェクトに「印刷」できる関数を作成しようとしています。私はobjstd::coutまたはfstreamのいずれかのような任意の出力オブジェクトになりたいので、私が使用してそれを呼び出すことができC++出力オブジェクトへの配列の出力(関数別)

template <class T, class Z> 
void print(T* array, int& size, Z& obj) 
{ 
    for (int k = 0; k < size; k++) 
     Z<< array[k] << " "; 
    Z<< std::endl; 
} 

:それはこのような少しを探している

print(arr_name, arr_size, std::cout) 

または

std::ostream file; 
print(arr_name, arr_size, file) 

残念ながら、現在のバージョンでは全く動作しません(エラーには '< <'が関係します)。どうしましたか?そのような機能を作ることさえ可能ですか?

+0

あなたは基本的に 'テンプレート無効印刷(イーターを開始したいです、Iter end、std :: ostream&os){std :: for_each(begin、end、[&](decltype(* begin)const&element){os <<要素 "" \ n ";}); } '。そして、次のような配列でそれを使う: 'int x [10]; –

+0

注: 'int&size'はナンセンスです(' intサイズにしてください ') –

答えて

1

引数の名前ではなく型を使用しています。

Z << array[k] << " "; 

あなたはL値が必要になりますよう非const参照はあまり意味がないよう、const int& sizeが良いだろうサイズを渡し、また

obj << array[k] << " "; 

でなければなりません。

しかし、これはあまり一般的ではありません。最善の解決策は、イテレータを使用して、完全に通常のC配列をスキップすること、及び(あなたがC++で作業しているので、理にかなって)代替としてstd::arrayを使用します。

template <class T, class Z> 
void print(const T& data, Z& obj) 
{ 
    for (const typename T::value_type& element : data) 
    obj << element; 
    obj << std::endl; 
} 

std::array<int, 5> data = {1,2,3,4,5}; 
std::vector<std::string> data2; 
print(data, std::cout); 
print(data2, std::cout); 
+0

ああ、私は座っていて何を理解しようとしているのですか? 1時間以上は間違っていた、どうか愚かな間違い。私は私の質問をd​​ownvoteすることができれば。 私はこれらの問題を修正しましたが、 'print(arr_name、arr_size、std :: cout) 'でもまだ使用できません。 – mdjdrn1

+0

@ mdjdrn1:実用的でない例を最低限提供してください。 – Jack

+0

私の悪い、私は今あなたの例を見て、単純なプログラムでそれを使用して、すべてが大丈夫です。どうもありがとう! – mdjdrn1