gpt4 book ai didi

c++ - 在 C++ 中,如何制作将未指定类型括在括号内的输出流?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:43 25 4
gpt4 key购买 nike

StackOverflow 的新手,请不要生吞我。

这是我的问题:我使用定义运算符 << 的类来输出它们的成员值。不幸的是,这些类忘记了成员值可以是其他类,并且它们没有将自己括在(比方说)大括号之间以保持结构信息的完整性。 我不能修改这些类,也没有关于它们结构的信息。这意味着我不能粗暴地浏览它们的内容。

为了示例,下面是一段代码,其中包含两个类 A 和 B(其中 B 包含一个类 A),它们输出它们的成员变量 ( "<variable_name>=<value>, " )。下面是在 b 的 cout 上使用 << 运算符的结果:

cout << b; // yields: m_a=m_foo=43586, m_bar=43604, m_foo=47938

由此可见,无法判断A有一个成员变量还是两个成员变量(m_bar属于A还是B?)。

我花了一些时间研究 ostream 的包装器,它会在既不是 C 风格字符串也不是整数的东西周围添加大括号。不幸的是,递归远没有我最初想象的那么简单。

produced result: B= { m_a=m_foo=43586, m_bar=43604, m_foo=47938 } 
expected result: B= { m_a= { m_foo=43586, m_bar=43604 } , m_foo=47938 }

(但它对 wrapper << 42 << "cstring" << variable_with_other_type; 非常有效)

这是我的问题:我这样做完全错了吗?我错过了一些明显的东西吗?我的问题的解决方案是否比我的方法复杂得多?

这是完整的代码( 它需要 C++11 右值,但我坚持使用只有 -std=c++0x 的 gcc 的过时版本,所以它需要尽可能少的 C++11 (将右值更改为 const 值以摆脱 C++11))。

#include <sstream>
#include <typeinfo>
using namespace std;

/* THIS BELOW CANNOT BE MODIFIED */

class A
{
public:
A(){
m_foo=0xAA42;
m_bar=0xAA54;
};
virtual ~A(){};
friend ostream& operator<<(ostream& os, const A& a);
int m_foo;
int m_bar;
};

class B
{
public:
B(A a) {
m_foo = 0xBB42;
m_a = a;
}
virtual ~B(){};
friend ostream& operator<<(ostream& os, const B& b);
A m_a;
int m_foo;
};

ostream& operator<<(ostream& os, const A& a)
{
// os << "{"; // woops forgot to uncomment this
os << "m_foo=" << a.m_foo;
os << ", ";
os << "m_bar=" << a.m_bar;
// os << "}"; // woops forgot to uncomment this
return os;
}

ostream& operator<<(ostream& os, const B& b)
{
// os << "{"; // woops forgot to uncomment this
os << "m_a=" << b.m_a;
os << ", ";
os << "m_foo=" << b.m_foo;
// os << "}"; // woops forgot to uncomment this
return os;
}

/* THIS BELOW CAN BE MODIFIED */

class WrappingOstream
{
public:
WrappingOstream(ostream& stream);
virtual ~WrappingOstream();

template <class T> WrappingOstream& operator<<(const T& x) {
m_stream << " { " << x << " } ";
//*this << " { " << x << " } "; //segfaults when replacing m_stream with *this
return *this;
}

WrappingOstream& operator<<(int i)
{
m_stream << i;
return *this;
}

WrappingOstream& operator<<(const char* cstr)
{
m_stream << cstr;
return *this;
}

private:
ostream& m_stream;
};

WrappingOstream::WrappingOstream(ostream& stream) :
m_stream(stream)
{
//ctor
}

WrappingOstream::~WrappingOstream()
{
//dtor
}



int main() {

A a;
B b(a);

ostringstream ss;
WrappingOstream wos(ss);
wos << b << endl;
cout << "produced result: B=" << ss.str();
cout << "expected result: B=" << " { m_a= { m_foo=43586, m_bar=43604 } , m_foo=47938 }";

}

提前致谢

最佳答案

就是因为这段代码:

template <class T> WrappingOstream& operator<<(const T& x) {
m_stream << " { " << x << " } ";

当你在 main 中传递 B 时,您正在使用 WrappingOstream,但在 operator<< 内部你正在使用 m_stream ,这是一个普通的 std::ostream .因此,当您打印 A 时,它会调用通用 operator<<而不是来自 WrappingOstream 的那个.尝试向这些方法添加调试打印输出以查看何时调用什么。

您可以通过子类化 std::ostringstream 来解决这个问题直接与 WrappingOstream .

关于c++ - 在 C++ 中,如何制作将未指定类型括在括号内的输出流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35178366/

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