另外,另一种解决方案是例如制作一个名为to_string的函数(这是直接将你的结构转换为字符串,但性能不好)
struct A
{
int a0;
string a1;
bool a2;
string to_string() const {
return "{ " + std::to_string(a0) + ", " + a1 + ", " + (a2 ? "true" : "false") + " }";
}
};
然后
template<typename T>
void print(const T &a) {
cout << a.to_string() << "\n";
}
这对打印不好,对于打印,使用实现operator<<的C++约定
但是。
这有一个缺点,当子类想要改变输出格式时。不能。
所以
class DynamicallyToStringConvertible {
public:
virtual string to_string() const = 0;
virtual ~DynamicallyToStringConvertible() {}
};
struct A: DynamicallyToStringConvertible
{
...
virtual string to_string() const {
return "{ " + std::to_string(a0) + ", " + a1 + ", " + (a2 ? "true" : "false") + " }";
}
}
struct SubclassFromA: public A {
virtual string to_string() const {
return "Subclass: " + A::to_string();
}
};
函数print原样
然后
void tryPrintingAsA(const A &a) {
print(a);
}
您现在会发现(在虚函数之后),这将适用于 SubclassA。
但是,如果您尝试了 operator<< 或解决方案的开头(没有虚拟的 to_string),它将适用于 SubclassA,因为它是普通 A。
然后你会做这样的事情
friend ostream &operator<<(ostream &s, const DynamicallyToStringConvertible &p) {
return s << p.to_string();
}
在您的 Base 类中,如下所示:
class DynamicallyToStringConvertible {
public:
virtual string to_string() const = 0;
virtual ~DynamicallyToStringConvertible() {}
friend ostream &operator<<(ostream &s, const DynamicallyToStringConvertible &p) {
return s << p.to_string();
}
};
现在试试 A 的打印函数是:
void tryPrintingAsA(const A &a) {
cout << a;
}