读书人

编写个函数模板接受一个ostream引用

发布时间: 2012-06-15 19:37:05 作者: rapoo

编写个函数模板,接受一个ostream引用和一个值,将该值写入流
编写个函数模板,接受一个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函数的内容,其实这个根本没有必要编写这个函数.

读书人网 >C++

热点推荐