gpt4 book ai didi

c++ - "Overriding"ostream& 运算符<<

转载 作者:行者123 更新时间:2023-11-28 07:11:18 28 4
gpt4 key购买 nike

我想实现一个字符串流对象,它表示某种类型 的字符串流。

例如,

class ohtmlstringstream : public std::ostringstream {
};
ohtmlstringstream& operator <<(ohtmlstringstream& ohss, double d) {
ohss << "<div title='double'>" << d << "</div>";
return ohss;
}

遗憾的是这不起作用,任何ohtmlstringstream我创建的对象 <<双进刚跑std::ostream& operator <<(std::ostream&, double) .

有什么方法可以做到这一点?看起来我不应该继承 ostringstream。

我真的只是想要一种干净简单的方法来“ fork ”特定类型的序列化方式。很长一段时间以来,我只想以一种方式序列化一个类型,但现在我想为至少 3 种情况构建我的类型的字符串表示:在 HTML(或 XML)表示中,在 JSON 中,以及在我已经采用的方式是在调试时转储到终端的基本方法。

最佳答案

抛开派生自 std::ostringstream 的一般智慧,也许是全局的

template<typename T> 
ohtmlstringstream & operator <<(ohtmlstringstream& ohss, T const & t)

以下内容会为您做:

#include <sstream>
#include <iostream>
#include <typeinfo>

using namespace std;

class ohtmlstringstream : public ostringstream {};

template<typename T>
ohtmlstringstream & operator <<(ohtmlstringstream& ohss, T const & t)
{
static_cast<ostringstream &>(ohss)
<< "<div title='"
<< typeid(T).name() // For the sake of illustration
<< "'>"
<< t <<
"</div>\n";
return ohss;
}

// Testing ...
int main()
{
ohtmlstringstream ohtml;
ohtml << string("Testing")
<< '1' << 2 << 3.0f << "4" << endl << "Bye" << endl;
cout << ohtml.str() << endl;
return 0;
}

输出:

<div title='Ss'>Testing</div>
<div title='c'>1</div>
<div title='i'>2</div>
<div title='f'>3</div>
<div title='A2_c'>4</div>

Bye

typeid(T).name() 无疑不是一个令人满意的 T 描述符。你可能会用特化的习惯代替它,比如:

template<typename T>
std::string type_desc(T const &)
{
return typeid(T).name();
}

对于您需要的所有 T(放弃自己做这么多苦差事)。

请注意,插入操纵符(例如 std::endl)会终止“html 化”,因为插入返回对基 std::ostream 的引用。

如果您不希望这种情况发生,您可能需要操纵器在 html 输出中仅需注意,但不采取行动。所以你可能添加专业:

inline ohtmlstringstream & 
operator <<(ohtmlstringstream& ohss, ostream & (*pf)(ostream &))
{
static_cast<ostringstream &>(ohss)
<< "<div title='"
<< typeid(pf).name()
<< "'>"
"</div>\n";
return ohss;
}

添加后输出变为:

<div title='Ss'>Testing</div>
<div title='c'>1</div>
<div title='i'>2</div>
<div title='f'>3</div>
<div title='A2_c'>4</div>
<div title='PFRSoS_E'></div>
<div title='A4_c'>Bye</div>
<div title='PFRSoS_E'></div>

(使用 gcc 4.8.2 和 clang 3.3 构建)

关于c++ - "Overriding"ostream& 运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20928353/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com