gpt4 book ai didi

c++ - 使用预处理器生成具有多个参数的显式实例化

转载 作者:行者123 更新时间:2023-12-05 04:22:05 25 4
gpt4 key购买 nike

在我的项目中,我希望对我的模板函数进行大量显式实例化以减少构建时间。现在我有很多功能,可以有不同的模板。出于这个原因(以防万一我想要更多)我不想手动输入它们,而是让它们由预处理器生成。

我想要生成的示例:

template bool match_any<x>();
template bool match_any<y<x>>();
template bool match_expr<x,y,z>();

鉴于x是 1 和定义的 max_dim 之间的整数, y可以是以下三个值之一:real, bool, indexz是 0 或 1。

我现在想生成这三个函数与参数(例如 template bool match_any<0>(); template bool match_any<1>(); template bool match_any<2>(); ... )的任何可能组合,但不仅仅是那些,因为我有大约 100 个具有相似结构的函数。

通过Using macros to define forward declarations我已经想出如何做一个重复的模式:

#define REP_INT_1(f) f(1)
#define REP_INT_2(f) REP_INT_1(f) f(2)
#define REP_INT_3(f) REP_INT_2(f) f(3)
#define REP_INT_4(f) REP_INT_3(f) f(4)

#define REP_INT(n,gen) REP_INT_(n,gen)
#define REP_INT_(n,gen) REP_INT_##n(gen)

然后我可以像这样使用它

#define GEN(x) template bool match_any<x>();
REP_INT(3, GEN)
#undef GEN

当然,重复这种模式很简单,例如用于字符串。

但我现在的问题是,由于模式的性质(当我将 GEN 作为“函数”传递)时,我不能为 GEN 设置两个参数。当然,我可以改变重复模式,因此它也适用于两个参数,但是我必须为任意数量的参数以及它们的每个顺序创建一个这样的新模式,这最终有点违背了目的,因为我将为每个函数准备一个大块 - 然后我可以手动编写它。

有没有人想过用不同的方法来“循环”可能的参数或如何扩展我现有的方法以使其适用于多个参数?

最佳答案

您可以像这样添加到您的宏中以实现某种程度上可维护的列表:

#define GEN_X(f) REP_INT(3, f)
#define GEN_Y(f, x) f(x, real) f(x, bool) f(x, index)
#define GEN_Z(f, x, y) f(x, y, 0) f(x, y, 1)

// GEN_F3 = generate functions with at least 3 arguments
#define GEN_F3(x, y, z) template bool match_any<x, y, z>();
#define GEN_F2(x, y) template bool match_any<y<x>>(); GEN_Z(GEN_F3, x, y)
#define GEN_F1(x) template bool match_any<x>(); GEN_Y(GEN_F2, x)
GEN_X(GEN_F1)

demo

我们将我们的变量生成器分开,然后我们可以将它们链接在一起以获得我们所有的排列:您的宏生成 x,它被输送到 GEN_F1,它处理单参数情况并将这些 x 值通过管道传递给 y 生成器,依此类推。

请注意,虽然我们已经使源代码线性可维护,但我们无法避免可执行文件大小的指数增长。


为了解决您的扩展问题,如果您希望能够直观地处理两个参数的任何数字排列,比如 x={1,2,3},y={1,2,3,4}您可能需要这样调整:

#define GEN_X(f) REP_INT(3, f)
#define GEN_Y(f, x) REP_INT(4, f)

这几乎可以工作,但是宏扩展会阻止在一个递归扩展中再次使用相同的 REP_INT_* 宏(至少以我所做的方式)。

一种解决方法是使用两个 REP_INT 列表(并且至少其中一个需要处理可变输入,将数字附加到末尾)。宏可以相同,除了名称需要不同以允许扩展继续。

然后我们可以像这样解决扩展问题:

#define GEN_X(f) REP1_INT_3(f)
#define GEN_Y(f, x) REP2_INT_4(f, x)

#define GEN_F2(x, y) template bool match_any<x, y>();
#define GEN_F1(x) GEN_Y(GEN_F2, x)
GEN_X(GEN_F1)

demo

关于c++ - 使用预处理器生成具有多个参数的显式实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74087025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com