我有一个我希望能够流式传输的对象。但是我希望能够通过使用不同的格式以不同的方式流式传输它,或者我应该说描述这个对象的方法。我想知道这应该如何用流来解决。
我想要的是能够使用通用格式并使用某种格式适配器将通用格式转换为首选格式。
我还希望能够将格式与 Item 的实现分开,这样我就不必在每次添加或更改新格式时都更改 Item。
这段代码大致说明了我想要什么。
Item item;
std::cout << "generic formatted:" << item;
std::cout << "custom formatted:" << CustomItemFormat() << item;
但这可能是不可能的或不切实际的。
面对这样的问题,流媒体库打算如何使用?
最佳答案
我个人会写一套格式化程序。
格式化程序必须知道他们正在格式化的对象的内部结构
但是让他们成为 friend 应该没什么大不了的。
class X
{ friend std::ostream& operator<<(std::ostream& str,XML_Format const& formatter);
friend std::ostream& operator<<(std::ostream& str,Json_Format const& formatter);
friend std::ostream& operator<<(std::ostream& str,Fred_Format const& formatter);
public: int value() const {return 5;}
};
struct XML__Foram { X const& print; XML_Format(X const& v): print(v) {} };
struct Json_Format { X const& print; Json_Format(X const& v): print(v) {} };
struct Fred_Format { X const& print; Fred_Format(X const& v): print(v) {} };
std::ostream& operator<<(std::ostream& str,XML_Format const& formatter)
{
return str << "<XObj>" << formatter.print.value() << "</XObj>";
}
std::ostream& operator<<(std::ostream& str,Json_Format const& formatter)
{
return str << "{XObj:{" << formatter.print.value() << "}}";
}
std::ostream& operator<<(std::ostream& str,Fred_Format const& formatter)
{
return str << "Killl Kill Kill. Friday 13th";
}
int main()
{
X obj;
std::cout << XML_Format(obj) << std::endl;
}
关于c++ - 使用 std::streams 格式化输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2171891/