C++ “覆盖”的问题;操作员<<&引用;课堂上源于;“奥斯特雷姆”;
我想创建一个基于“ostream”的类,该类执行一些自动格式化以生成逗号或制表符分隔的值文件。我的想法是覆盖“operator操作符C++ “覆盖”的问题;操作员<<&引用;课堂上源于;“奥斯特雷姆”;,c++,C++,我想创建一个基于“ostream”的类,该类执行一些自动格式化以生成逗号或制表符分隔的值文件。我的想法是覆盖“operator操作符操作符,类似以下的操作可能会起作用: 包括 #包括 #包括 使用名称空间std; 类MyStream:公共ostream { 公众: MyStream(ostream&out):ostream(out.rdbuf()){} 模板MyStream&operatorNB。最终你需要将MyStream放入一个标题中。在这一点上,不要使用名称空间std。而是完全限定stl中
操作符,类似以下的操作可能会起作用:
包括
#包括
#包括
使用名称空间std;
类MyStream:公共ostream
{
公众:
MyStream(ostream&out):ostream(out.rdbuf()){}
模板MyStream&operatorNB。最终你需要将MyStream放入一个标题中。在这一点上,不要使用名称空间std
。而是完全限定stl中的项目,例如std::ostream
,谢谢你对我的帖子发表评论,我现在已经删除了该帖子-我从OP now获得了需求的要点。你对此有何评论quamrana的问题,你会问“为什么你不想在接受ostream的地方替换MyStream?”:我认为继承在这里没有任何好处。它只会带来一些危险。因为不同的运营商
#include <iostream>
#include <ostream>
#include <string>
using namespace std;
class MyStream: public ostream
{
public:
MyStream(ostream& out): ostream(out.rdbuf()) {}
template <typename T> MyStream& operator<<(T value)
{
ostream::operator<<('+');
ostream::operator<<(value);
ostream::operator<<('+');
return *this;
}
};
template<> MyStream& MyStream::operator<< <string>(string value)
{
ostream::operator<<('*');
ostream::write(value.c_str(), value.size()); // ostream::operator<<(value);
ostream::operator<<('*');
return *this;
}
int main()
{
MyStream mystr(cout);
mystr << 10;
cout << endl;
mystr << "foo";
cout << endl;
mystr << string("test");
cout << endl;
return 0;
}
#include <ostream>
#include <string>
using namespace std;
class MyStream: public ostream
{
public:
MyStream(ostream& out): ostream(out.rdbuf()) {}
template <typename T> MyStream& operator<<(const T& value)
{
(ostream&)*this << '+' << value << '+';
return *this;
}
MyStream& operator<< (const string& value)
{
(ostream&)*this << '*' << value << '*';
return *this;
}
MyStream& operator<< (const char* cstr)
{
(ostream&)*this << '(' << cstr << ')';
return *this;
}
};