使用宏循环
Looping with macros
本文关键字:循环 更新时间:2023-10-16
我需要做一个循环,在这个循环中我把这个简单的反射示例变成:
std::string mystring[3] = {{"mystring[0]"},{"mystring[1]"},{"mystring[2]"}};
转换为更易于管理的形式,用于更长的阵列。 解决方案听起来像我应该使用带有循环或递归的宏。但是,宏不支持循环或递归!
如何创建一个宏来为我任意处理这个问题?
#define NAME_OBJ(type, name, size)
尝试使用 Boost。如果失败,请尝试使用更多速推。
#include <boost/preprocessor/repeat.hpp>
#include <boost/preprocessor/comma_if.hpp>
#include <boost/preprocessor/stringize.hpp>
#define DETAIL_NAME_OBJ_ELEM(z, n, name)
BOOST_PP_COMMA_IF(n) { BOOST_PP_STRINGIZE(name) "[" BOOST_PP_STRINGIZE(n) "]" }
#define NAME_OBJ(type, name, size)
type name[size] = { BOOST_PP_REPEAT(size, DETAIL_NAME_OBJ_ELEM, name) }
然后这个:
NAME_OBJ(std::string, mystring, 3);
。扩展到此:
std::string mystring[3] = {
{ "mystring" "[" "0" "]" },
{ "mystring" "[" "1" "]" },
{ "mystring" "[" "2" "]" }
};
。然后在编译之前自动合并相邻的字符串文本。
在科里鲁现场观看
如前所述,C++中的宏不支持循环或递归,因此您必须复制代码行。
解决此类主题的常用方法是编写一个程序 - 假设 myGenerator
,它包含一个"正常"的C++循环,其输出是一个C++源文件(.cpp 或 .h(。然后在构建程序的其余部分之前,在生成步骤中集成对myGenerartor
的调用。
基于此处处理宏的出色答案https://stackoverflow.com/a/12540675/1723954
我修改/简化了此特定情况的解决方案:
#define NAME_OBJ(type, name, size)
type name[size] = { INIT_ELEMENT_ ## size(name) }
#define INIT_ELEMENT_1(name) { #name "[0]" }
#define INIT_ELEMENT_2(name) INIT_ELEMENT_1(name), { #name "[1]" }
#define INIT_ELEMENT_3(name) INIT_ELEMENT_2(name), { #name "[2]" }
...
该解决方案不允许非常非常大的数组,只允许您编写代码的大小。 我做了 128 个,这对我项目中的所有案例都很好。
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 在基于范围的for循环中使用结构化绑定声明
- 用于C++中带有数组和指针的循环
- 循环中的随机函数
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 在循环C++中指定字符串之后,不会打印该字符串