c++ - 为结构/类自动生成流运算符

标签 c++ automation code-generation generator iostream

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

输入(取自 One Debug-Print function to rule them all ):

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;

输出:

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

任何工具都可以,首选 Python/Ruby 脚本。

最佳答案

为此需要一个工具,它可以准确地解析 C++,枚举各种类/结构,在每个类/结构的基础上确定并生成您的“序列化”,然后将生成的代码放置在“正确的” place”(可能是发现该结构的相同范围)。它需要一个完整的预处理器来处理实际代码中指令的扩展。

我们的 DMS Software Reengineering Toolkit与其 C++11 front end可以做到这一点。 DMS 通过提供通用解析/AST 构建、符号表构建、流和自定义分析、转换和源代码再生功能来实现自定义工具的构建。 C++ 前端使 DMS 能够解析 C++ 并构建准确的符号表,以及将修改后的或新的 AST 漂亮地打印回可编译的源代码形式。 DMS 及其 C++ 前端已用于对 C++ 代码进行大量转换。

你必须向DMS解释你想做什么;枚举符号表条目似乎很简单,询问结构/类类型声明,确定声明的范围(记录在符号表条目中),通过组合表面语法模式构造 AST,然后应用转换来插入构造的 AST。

所需的核心表面语法模式是插槽和函数体的语法模式:

 pattern ostream_on_slot(i:IDENTIFIER):expression =
   " << "\n\t" << \tostring\(\i\) << r.\i "; -- tostring is a function that generates "<name>"

 pattern ostream_on_struct(i:IDENTIFIER,ostream_on_slots:expression): declaration =
   " std::ostream& operator <<(std::ostream& os, const \i& r) 
     { os << \tostring\(\i\) << " { " << \ostream_on_slots << "\n}";
       return os; 
     }

必须为 ostream_on_slot 组成单独的树:

 pattern compound_ostream(e1:expression, e2:expression): expression
     = " \e1 << \e2 ";

使用这些模式,可以直接枚举结构的槽,为主体构造 ostream,并将其插入到结构的整体函数中。

关于c++ - 为结构/类自动生成流运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10498557/

相关文章:

c++ - Visual C++ 应用程序在窗体后面打开一个命令提示符

c++ - 将 Mat 拆分为相同大小的 subMat

powershell - Powershell和自动化

linq-to-sql - SqlMetal 生成垃圾关联名称

c++ - 推导模板的非类型名参数的值

c++ - libxml2 XPATH - 从 XML 中选择数据子集

ios - 使用设备上的仪器进行自动化测试

python - 如何在大量文件中将一个类替换为另一个模块中的另一个类,而无需进行大量手动编辑?

python - 生成带有参数的 Python 模板

javascript - 为什么 GWT 和 Script# 风格的框架没有成为主流?