在模板功能中打印任何结构

print any struct in template function

本文关键字:打印 任何 结构 功能      更新时间:2023-10-16

我有3个或更多结构,我希望我有一个功能以打印任何struct

例如:

struct A 
{
  int a0;
  string a1;
  bool a2;
}

struct B
{
 CString b0;
 double b1;
 int b2;
 string b3
}

我想用相同功能打印此结构(a和b(

这样:

template<typename T>
inline void print(T)
{
  std::cout << // I don't know what is write here....
}

有任何身体帮助我?

C 中通常的练习是为您的类型定义operator<<(std::ostream &, const T &)

std::ostream &operator<<(std::ostream &os, const A &value)
{
    // print here
    return os;
}

应该针对要打印的每种类型进行此功能,并且该功能应与该类型相同的名称空间定义。

之后,您的数据类型可以打印到所有输出流。这也允许boost::lexical_cast之类的东西与您的类型一起使用,因为它在内部将值打印到std::stringstream

另外,另一个解决方案是制作一个称为 to_string的函数(这是直接将您的struct转换为字符串,但性能不好(

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 约定

但是。

当子类想要更改输出格式时,这具有不利地位。它不能。

so

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();
}

在您的基类内部,

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;
}