我有以下模板功能,可以打印到cout:
template <typename T> void prn_vec(const std::vector < T >&arg, string sep="")
{
for (unsigned n = 0; n < arg.size(); n++) {
cout << arg[n] << sep;
}
return;
}
// Usage:
//prn_vec<int>(myVec,"\t");
// I tried this but it fails:
/*
template <typename T> void prn_vec_os(const std::vector < T >&arg,
string sep="",ofstream fn)
{
for (unsigned n = 0; n < arg.size(); n++) {
fn << arg[n] << sep;
}
return;
}
*/
如何修改它以便它还将文件句柄作为输入并打印输出 到文件句柄引用的那个文件?
这样我们就可以做到:
#include <fstream>
#include <vector>
#include <iostream>
int main () {
vector <int> MyVec;
MyVec.push_back(123);
MyVec.push_back(10);
ofstream myfile;
myfile.open ("example.txt");
myfile << "Writing this to a file.\n";
// prn_vec(MyVec,myfile,"\t");
myfile.close();
return 0;
}
答案 0 :(得分:3)
template <typename T>
ostream& prn_vec(ostream& o, const std::vector < T >&arg, string sep="")
{
for (unsigned n = 0; n < arg.size(); n++) {
o << arg[n] << sep;
}
return o;
}
int main () {
vector <int> MyVec;
// ...
ofstream myfile;
// ...
prn_vec(myfile, MyVec, "\t");
myfile.close();
return 0;
}
答案 1 :(得分:1)
通过引用传递ofstream:
template <typename T> void prn_vec_os(
const std::vector < T >&arg,
string sep,
ofstream& fn)
此外,删除sep的默认值,或重新排序参数,因为在参数列表的中间不能有一个默认参数,其中包含非默认值。
编辑:正如评论中所建议并在dirkgently的答案中实现的那样,你很可能想要使用ostream而不是ofstream,以便更加通用。