gpt4 book ai didi

c++ - 使用具有可变数量参数的宏编写函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:20:05 27 4
gpt4 key购买 nike

如何编写具有可变数量参数的宏来定义函数?假设我们定义类 class1 有两个参数,类 class2 有三个参数。

class class1 {
public:
int arg1;
int arg2;
class1(int x1, int x2): arg1(x1), arg2(x2) {}
};
class class2 {
public:
int arg1;
int arg2;
int arg3;
class1(int x1, int x2, int x3): arg1(x1), arg2(x2), arg3(x3) {}
};

对于我定义的每个类,甚至是在我要编写以下内容之前已经定义的类:

template<> inline void writeInfo<class1>(const class1& obj, FILE* fp) {
writeAmount(2, fp);
writeName("arg1", fp);
writeInfo(obj.arg1, fp);
writeName("arg2", fp);
writeInfo(obj.arg2, fp);
}
template<> inline void writeInfo<class2>(const class2& obj, FILE* fp) {
writeAmount(3, fp);
writeName("arg1", fp);
writeInfo(obj.arg1, fp);
writeName("arg2", fp);
writeInfo(obj.arg2, fp);
writeName("arg3", fp);
writeInfo(obj.arg3, fp);
}

我们不需要关心writeAmountwriteNamewriteInfo的定义。我想做的是写这样的东西:

MACROWRITEINFO(class1, 2, arg1, arg2);
MACROWRITEINFO(class2, 3, arg1, arg2, arg3);

是否可以创建这样的宏,以便它可以扩展到上述模板定义?我在很多地方都读到宏是邪恶的,但在这种情况下,我相信它们非常有用,因为它们会减少我键入的代码量,从而减少我在创建模板函数。

最佳答案

首先你应该改进你的格式/代码。您的代码在类定义后缺少“类”关键字和分号 - 当您发布代码片段时,请确保它是正确的代码,因为有些人(即我)会尝试编译它。

其次,不要使用函数模板特化。如果宏是邪恶的,那么它们一定是撒旦的化身。只需坚持良好的旧重载。参见 here了解详情。

至少 - 一个答案。如果所有 args 的类型相同,您可能会乱用可变参数宏 - 例如,您可以在 writeInfo 函数中创建一个数组并遍历元素。由于这里显然不是这种情况,您可以为不同数量的参数定义 MACROWRITEINFO 宏的许多变体,使用一些公共(public) block 来减少代码重复。例如:

#define MACROWRITEINFO_BEGIN(type, amount)  \
void writeInfo(const type& obj, FILE* fp) \
{ \
writeAmount(amount, fp);

#define MACROWRITEINFO_NAMEINFO(name) \
writeName(#name, fp); \
writeInfo(obj.##name, fp);

#define MACROWRITEINFO_END() \
}

使用这些,您现在可以根据参数数量定义变体。

#define MACROWRITEINFO1(type, arg1) \
MACROWRITEINFO_BEGIN(type, 1) \
MACROWRITEINFO_NAMEINFO(arg1) \
MACROWRITEINFO_END()

#define MACROWRITEINFO2(type, arg1, arg2) \
MACROWRITEINFO_BEGIN(type, 2) \
MACROWRITEINFO_NAMEINFO(arg1) \
MACROWRITEINFO_NAMEINFO(arg2) \
MACROWRITEINFO_END()

等等……

编辑:好吧,我猜可以在这里使用可变参数宏。看看这个SO question .这纯粹是疯狂,但你应该能够实现你想要的。

编辑:我的想法是将可变参数扩展到数组中,然后遍历它们;如果它们是同一类型,比如说 int,你可以这样写:

#define VAARGSSAMPLE(...) \
int args[] = { __VA_ARGS__ }; \
for (int i = 0; i < sizeof(args)/sizeof(int); ++i) \
{ \
printf("%d\n", args[i]); \
}

VAARGSSAMPLE(1, 5, 666);

因此,如果您所有的变量都是同一类型,您可以将它们放在一个数组中。但他们不是,所以它不会做。如果您真的非常想坚持使用可变参数,请转到我的第一个编辑。

关于c++ - 使用具有可变数量参数的宏编写函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6787213/

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