编写个函数模板,接受一个ostream引用和一个值,将该值写入流,该如何解决
编写个函数模板,接受一个ostream引用和一个值,将该值写入流
编写个函数模板,接受一个ostream引用和一个值,将该值写入流
用4中不同的类型调用函数
分别写至cout,文件和stringstream
这个什么问题 #include<sstream>怎么用的
------解决方案--------------------
原来楼主在纠缠编译通不过的问题啊+_+?
那个改一句便可以了(原来还以为是楼主的笔误呢……)
ostringstream oss(desstr);
改为:
ostringstream oss;
------解决方案--------------------
我看不懂你在问什么,随便说说,首先你的 desstr 压根没有定义过,肯定无法编译通过,
另外一个可能让你疑惑的地方应该是 ostringstream 的那个参数为 const string& 的构造函数吧,
你这么用肯定不知道它会有什么表现,而且你很可能误解了它的意义,看看我改的代码,
应该能让你清楚这个构造函数的意义:
编写个函数模板,接受一个ostream引用和一个值,将该值写入流
用4中不同的类型调用函数
分别写至cout,文件和stringstream
- C/C++ code
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
using namespace std;
template <typename T1,typename T2>
T1& print(T1 &s,T2 val)
{
s < <val;
return s;
}
int main()
{
double dval=0.88;
float fval=-12.3;
string oristr="this is a test";
ostringstream oss(desstr);
ofstream outFile("result.dat");
//写入cout
print(cout,-3) < <endl;
print(cout,dval) < <endl;
print(cout,fval) < <endl;
print(cout,oristr) < <endl;
//写入文件
print(outFile,-3) < <endl;
print(outFile,dval) < <endl;
print(outFile,fval) < <endl;
print(outFile,oristr) < <endl;
outFile.close();
//写入stringstream
print(oss,-3) < <endl;
print(oss,dval) < <endl;
print(oss,fval) < <endl;
print(oss,oristr) < <endl;
//将stringstream中的字符串输出到cout已经行验证
cout < <oss.str() < <endl;
return 0;
}
这个什么问题 #include<sstream>怎么用的
------解决方案--------------------
原来楼主在纠缠编译通不过的问题啊+_+?
那个改一句便可以了(原来还以为是楼主的笔误呢……)
ostringstream oss(desstr);
改为:
ostringstream oss;
------解决方案--------------------
我看不懂你在问什么,随便说说,首先你的 desstr 压根没有定义过,肯定无法编译通过,
另外一个可能让你疑惑的地方应该是 ostringstream 的那个参数为 const string& 的构造函数吧,
你这么用肯定不知道它会有什么表现,而且你很可能误解了它的意义,看看我改的代码,
应该能让你清楚这个构造函数的意义:
- C/C++ code
#include<iostream> #include<string> #include<fstream> #include<sstream> using namespace std; template<typename T1,typename T2> T1& print(T1 &s,T2 val) { s<<val; return s; } int main() { double dval=0.88; float fval=-12.3; string oristr="this is a test"; string desstr("this is a long string, to show how to use the constructor of basic_ostringstream<>."); ostringstream oss(desstr);//只有用“比输入内容更长”的内容去初始化它,才能看到这个初始化的意义。 ofstream outFile("result.dat"); //写入cout print(cout,-3)<<endl; print(cout,dval)<<endl; print(cout,fval)<<endl; print(cout,oristr)<<endl; //写入文件 print(outFile,-3)<<endl; print(outFile,dval)<<endl; print(outFile,fval)<<endl; print(outFile,oristr)<<endl; outFile.close(); //写入stringstream print(oss,-3)<<endl; print(oss,dval)<<endl; print(oss,fval)<<endl; print(oss,oristr)<<endl; //将stringstream中的字符串输出到cout已经行验证 cout<<oss.str()<<" <<<<<<Note: content after \"" << oristr << "\" is the rest of original buffer."<<endl; return 0; }
------解决方案--------------------
上面的朋友都说了问题的意见.我要说的是另外的问题:
楼主的那个模版函数,其实只需要一个参数,因为第一个参数总是输出流,是一个抽象类.如下面:
template<typename T2>
ostream& print(ostream& os, T2& val)
{
s << val;
return s;
}
因为,楼主上面的例子里面, ostreamstream, ofstream都是 ostream的子类.
根据print函数的内容,其实这个根本没有必要编写这个函数.