- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的服务器中有一个结构,我想用 C++ 中的宏或模板生成它,因为它有很多冗余的东西:
struct MyBlock {
void Merge(const MyBlock& from) {
if (apple.HasData()) {
apple.Merge(from.apple);
}
if (banana.HasData()) {
banana.Merge(from.banana());
}
...
}
void Clear() {
apple.Clear();
banana.Clear();
...
}
void Update(const SimpleBlock& simple_block) {
if (simple_block.apple.Updated()) {
apple.Add(simple_block.apple);
}
if (simple_block.banana.Updated()) {
banana.Add(simple_block.banana);
}
...
}
Fruit apple;
Fruit banana;
Animal dog;
Animal cat;
...
}
struct SimpleBlock {
SimpleFruit apple;
SimpleFruit banana;
SimpleAnimal dog;
SimpleAnimal cat;
...;
}
我想在 apple 和 dog 这两个 block 中定义更多变量。我还想定义更多对这样的 block 。但是涉及到很多琐碎的工作。所以我的问题是我们如何使用宏、模板或其他一些 C++ 功能(包括 C++11)在编译时生成这些 block ?
我不使用集合来存储这些变量的原因是因为 MyBlock 结构将作为参数传递到另一个模板类中,该模板类将在运行时动态分配和释放该 block 。它实际上是一个会定期聚合的线程本地 block 。
最佳答案
预处理器列表迭代足够简单:
#define M_NARGS(...) M_NARGS_(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#define M_NARGS_(_10, _9, _8, _7, _6, _5, _4, _3, _2, _1, N, ...) N
#define M_CONC(A, B) M_CONC_(A, B)
#define M_CONC_(A, B) A##B
#define M_ID(...) __VA_ARGS__
#define M_LEFT(L, R) L
#define M_RIGHT(L, R) R
#define M_FOR_EACH(ACTN, ...) M_CONC(M_FOR_EACH_, M_NARGS(__VA_ARGS__)) (ACTN, __VA_ARGS__)
#define M_FOR_EACH_0(ACTN, E) E
#define M_FOR_EACH_1(ACTN, E) ACTN(E)
#define M_FOR_EACH_2(ACTN, E, ...) ACTN(E) M_FOR_EACH_1(ACTN, __VA_ARGS__)
#define M_FOR_EACH_3(ACTN, E, ...) ACTN(E) M_FOR_EACH_2(ACTN, __VA_ARGS__)
#define M_FOR_EACH_4(ACTN, E, ...) ACTN(E) M_FOR_EACH_3(ACTN, __VA_ARGS__)
#define M_FOR_EACH_5(ACTN, E, ...) ACTN(E) M_FOR_EACH_4(ACTN, __VA_ARGS__)
//.. extend this to higher numbers with some copy&paste
#define MYBLOCK(...) struct MyBlock { \
void Merge(const MyBlock& from) { \
M_FOR_EACH(BLOCK_MERGE, __VA_ARGS__) \
} \
void Clear() { \
M_FOR_EACH(BLOCK_CLEAR, __VA_ARGS__) \
} \
void Update(const SimpleBlock& simple_block) { \
M_FOR_EACH(BLOCK_UPDATE, __VA_ARGS__) \
} \
M_FOR_EACH(BLOCK_FIELD, __VA_ARGS__) \
}
#define BLOCK_MERGE(F) if (M_ID(M_RIGHT F).HasData()) { \
M_ID(M_RIGHT F).Merge(from.M_ID(M_RIGHT F)); \
}
#define BLOCK_CLEAR(F) M_ID(M_RIGHT F).Clear;
#define BLOCK_UPDATE(F) if (simple_block.M_ID(M_RIGHT F).Updated()) { \
M_ID(M_RIGHT F).Add(simple_block.M_ID(M_RIGHT F)); \
}
#define BLOCK_FIELD(F) M_ID(M_LEFT F) M_ID(M_RIGHT F);
#define SIMPLEBLOCK(...) struct SimpleBlock { M_FOR_EACH(SIMPLE_DECL, __VA_ARGS__) }
#define SIMPLE_DECL(F) M_CONC(Simple, M_ID(M_LEFT F)) M_ID(M_RIGHT F);
#define FIELDS (Fruit, apple),(Fruit,banana),(Animal,dog),(Animal,cat)
MYBLOCK(FIELDS);
SIMPLEBLOCK(FIELDS);
以现有格式向 FIELDS
添加必要的其他成员变量,它们将被添加到 MYBLOCK
和 SIMPLEBLOCK
发出的结构中. (记得用更多的迭代来扩展 M_FOR_EACH
...用几个 ctrl+c,ctrl+v 很容易做到。)
关于c++ - C++ 中编译时生成的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26568721/
是否可以仅在点击 anchor 时为其分配 url? Token Link 当点击 anchor 时,它将转到 http://example.com/token=xxxxx/ 我只想在单击时生成 to
我不能 100% 确定我的错误。当我尝试生成 PDF 时,我得到了此编码输出: %PDF-1.4 %���� 3 0 obj <> /Contents 4 0 R>> endobj 4 0 obj <
下面的代码有几个函数,这些函数允许诸如将数据写入文档、读取文档以及将数据放入数组中以用于稍后的 JTable 等操作。 package tabletest.populatetable; import
我检查了我的网站 (WordPress) 应用程序的页面源并发现了以下内容 <iframe src="https://www.google.com/recaptcha
我有一个最终会生成 OutOfMemory 的程序。程序代码为: public class VeryLargeObject implements Serializable { public s
所以我正在构建一个博客引擎,它具有/articles/then-the-article-permalink 作为 URL 结构。我需要有 prev 和 next 链接,它们将通过 pub_date 跳
我有这个列表: string[] countries = { "USA", "CANADA" }; 当我运行这个查询时: query = (from user
我有一个将 InputStream 作为 InputStreamResource 返回的方法,当我让 swagger 生成文档时,它说返回类型是 InputStreamResource。如何更改此设置
令人惊讶的是,我找不到关于这个主题的任何内容。当在 EditText 中检测到“@”时,动态生成 ListView 的方法是什么。这是一个例子: 这是我目前所拥有的: textfield.setOn
我发现 Menhir 提供了 --dump 和 --explain 选项,它对调试有很大帮助。但是如何在 ocamlbuild 下启用这些选项,以便 Menhir 在编译时始终生成转储文件? 我尝试编
您好,我正在寻找使用 ajax 提交表单时在 codeigniter 中重新生成 csrf token 的过程。我希望在不刷新页面的情况下重新生成 token 。有没有办法做到这一点。 最佳答案 根据
int main(void) { float a; scanf("%f", &a); double c = sqrt(a); printf("%f", c);
我有看起来像这样的 Hibernate 实体(省略了 getter 和 setter): @Entity public class EntityA { @ManyToOne(fetch = F
我正在使用 git 来跟踪 wireshark project .我想提交一个补丁,但是所需的格式是以下输出(参见 http://www.wireshark.org/develop.html ): s
Spring 最近发布的关于在 Spring Boot 项目中使用静态 Web 内容的博文 (https://spring.io/blog/2013/12/19/serving-static-web-
我正在尝试设置我的测试环境,其中包括 React 测试库、Redux 工具包、RTK 查询和 TypeScript,但我遇到了一个我无法解决的问题。 我想不通的主要问题是如何生成 AppDispatc
我正在尝试将使用 Microsoft Access 数据库的网站移植到 MySQL。首先,我尝试打开 SQL 数据库: (旧)访问代码是: Set cn = Server.CreateObject (
我正在运行一个基本上从 Twitter 中提取推文的 Flask 应用程序。虽然使用嵌入式 Flask 服务器运行应用程序没有问题,但在 gUnicorn 中运行时我收到重复的推文,主要是因为我有 2
我正在学习 Python-这给了我一个 IO 错误- f = open('money.txt') while True: currentmoney = float(f.readline())
我想生成 N 个随机点,其乘积为某个值 1。 我在 MATALB 中是这样做的: N_=10; x1_=rand(1, N_); p_=prod(x1_); x_=x1_; x_(end)=x1_(e
我是一名优秀的程序员,十分优秀!