为struct/class自动生成流操作符

Chr*_*bek 11 c++ automation iostream code-generation generator

是否有工具为结构或类自动生成ostream <<运算符?

输入(取自一个Debug-Print函数来统治它们):

typedef struct ReqCntrlT    /* Request control record */
{
  int             connectionID;
  int             dbApplID;
  char            appDescr[MAX_APPDSCR];
  int             reqID;
  int         resubmitFlag;
  unsigned int    resubmitNo;
  char            VCIver[MAX_VCIVER];
  int             loginID;
}   ReqCntrlT;
Run Code Online (Sandbox Code Playgroud)

输出:

std::ostream& operator <<(std::ostream& os, const ReqCntrlT& r) 
{
   os << "reqControl { "
      << "\n\tconnectionID: " << r.connectionID 
      << "\n\tdbApplID: " << r.dbApplID 
      << "\n\tappDescr: " << r.appDescr
      << "\n\treqID: " << r.reqID
      << "\n\tresubmitFlag: " << r.resubmitFlag
      << "\n\tresubmitNo: " << r.resubmitNo
      << "\n\tVCIver: " << r.VCIver
      << "\n\tloginID: " << r.loginID
      << "\n}";
   return os; 
}
Run Code Online (Sandbox Code Playgroud)

任何工具都可以,Python/Ruby脚本将是首选.

Qua*_*eek 0

我确实从两个方面理解了你的问题。

如果您想生成程序的自动状态报告,我建议您检查Boost.Serialization。但是,作为第一步或为了获得灵感,它不会在编译时生成代码。下面的代码将帮助您生成 xml 或 txt 文件以供您阅读。

typedef struct ReqCntrlT    /* Request control record */
{
  int             connectionID;
  int             dbApplID;
  char            appDescr[MAX_APPDSCR];
  int             reqID;
  int         resubmitFlag;
  unsigned int    resubmitNo;
  char            VCIver[MAX_VCIVER];
  int             loginID;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & connectionID;
        ar & reqID;
        ...
    }
}   ReqCntrlT;
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅教程:http://www.boost.org/doc/libs/1_49_0/libs/serialization/doc/index.html

如果您只是尝试通过给出参数名称来“编写”代码。那么你应该看看 python 或 perl 中的正则表达式。该解决方案的主要默认设置是您的结构处于“离线”状态,即每次更改某些内容时都必须运行它。

伯努瓦.