c++ - 将具有特定模式匹配的所有声明推送到向量中的优雅方式?
问题描述
我正在重构一些代码,并好奇是否有现代 C++ 功能允许我将所有匹配的声明动态推送到向量中,而无需手动输入每个参数名称。
例如;
我的标题中有以下声明(在其他地方实例化);
Fl_Button * button_file_browse;
Fl_Button * button_parse_txt;
Fl_Button * button_parse_xer;
Fl_Button * button_file_browse;
Fl_Button * button_perform_sentiment;
Fl_Button * button_txt_folder_browse;
然后在其他地方我将这些全部推入一个向量中;大量的小部件有点痛苦。特别是如果我添加一个新的 Fl_Button,我还需要将它添加到这段代码中。
std::vector<Fl_Button *> vector_fl_button;
vector_fl_button.push_back(button_file_browse);
vector_fl_button.push_back(button_parse_txt);
vector_fl_button.push_back(button_parse_xer);
vector_fl_button.push_back(button_perform_sentiment);
vector_fl_button.push_back(button_txt_folder_browse);
是否有一个漂亮的 C++ 功能可以让我输入如下优雅的内容?
std::vector<Fl_Button *> vector_fl_button;
vector_fl_button.push_back(button_*); // Pushes all pointers starting with button_
解决方案
只是为了展示,如果您手头有强大的脚本语言,代码生成是多么简单。我通常使用 Common Lisp,因为无论如何我都使用 emacs,所以这一切都是“内部”完成的。而且我通常用 Lisp 编程,只是有时我会退回到我以前的首选语言 C++...
特别是对于维护,它可能会带来回报并减少“疏忽错误”。由于我使用cl-ppcre
的是 Lisp 正则表达式引擎,你甚至可以考虑利用你做事的习惯对你有利。
例如,如果您在该标头中的单个类中始终有 1 个带有按钮声明的头文件,则可以只使用该头文件,而不是将按钮声明复制并粘贴到 lisp 代码中...
下面的几行 lisp 只是展示了基础知识。如果 Lisp 不是你的菜,我想你可以在 APL 或 Haskell 或 Perl 或 Julia 甚至 Python 中做同样的事情。
(defparameter *my-buttons*
"Fl_Button * button_file_browse;
Fl_Button * button_parse_txt;
Fl_Button * button_parse_xer;
Fl_Button * button_file_browse;
Fl_Button * button_perform_sentiment;
Fl_Button * button_txt_folder_browse;")
(defparameter *button-decl-pattern*
(ppcre:create-scanner "\\s*Fl_Button\\s*\\*\\s*(button_\\w+);"))
(defun button-names (&optional (decls *my-buttons*))
(with-input-from-string (stream decls)
(loop for line = (read-line stream nil)
while line
collecting
(aref
(nth-value 1 (ppcre:scan-to-strings
*button-decl-pattern*
line))
0))))
(defun vectorize-buttons (buttons)
(with-output-to-string (stream)
(format stream "std::vector<Fl_Button *> vector_fl_button;~%")
(loop for button in buttons do
(format stream
"vector_fl_button.push_back(~A);~%"
button))))
CL-USER> (vectorize-buttons (button-names))
"std::vector<Fl_Button *> vector_fl_button;vector_fl_button.push_back(button_file_browse);vector_fl_button.push_back(button_parse_txt);vector_fl_button.push_back(button_parse_xer);vector_fl_button.push_back( button_file_browse);vector_fl_button.push_back(button_perform_sentiment);vector_fl_button.push_back(button_txt_folder_browse);"
推荐阅读
- java - 在Java中按降序对数组进行排序
- python - 页面加载后如何使硒刮页面
- input - LUA - 有没有办法将用户的输入分配为表的键?
- git - 如何删除git上的子分支?
- python - Matplotlib 中的圆线
- sql-server - 访问被拒绝在 Inno Setup 中恢复 SQL Server 备份文件
- powerpoint - 将章节/章节标签添加到幻灯片标题
- php - 我的 cron 工作不工作有什么问题
- r - 如何删除只有零值的 R data.frame 列?
- python - 以下代码出于某种原因给出了 i = 0, 1, 2, 3, 4 的输出。谁能解释这是怎么回事?