gpt4 book ai didi

C++ 将函数名传递给宏并调用它

转载 作者:搜寻专家 更新时间:2023-10-31 02:16:50 24 4
gpt4 key购买 nike

我有两个类(class)。第一类做一些事情然后只调用第二类的方法。头等舱的每一种方法都是这样做的。是否可以使用一些宏自动执行代码?

例子:

class A
{
void Do1()
{
Do task x
ClassB b;
b.Do1();
Do task y
}
void Do2()
{
Do task x
ClassB b;
b.Do2();
Do task y
}
}

这种方式可以实现吗?这不起作用,但类似的东西。

#define VOID_FUNC(name) \
Do task x;\
ClassB b;\
b.##name##();\
Do task y;

class A
{
void Do1()
{
VOID_FUNC(__FUNCTION__);
}
void Do2()
{
VOID_FUNC(__FUNCTION__);
}
}

最佳答案

避免使用宏有很多充分的理由,因为它们不尊重命名空间。

另一种解决方案是在您想要重用 task xtask y 时使用 lambda 函数(C++11 及更高版本):

class A
{
template <typename Fun>
void wrapClassB(Fun&& fun)
{
Do task x
ClassB b;
fun(b);
Do task y
}

void Do1()
{
wrapClassB([] (ClassB& b) {
b.Do1();
});
}
void Do2()
{
wrapClassB([] (ClassB& b) {
b.Do2();
});
}
};

对于 C++11 之前的版本,您可以创建 functors而不是 lambda 并将 Fun&& 替换为 const Fun&

或者,如果你真的想使用宏,你可以只用宏定义整个函数:

#define VOID_FUNC(name) \
void name() {\
Do task x;\
ClassB b;\
b.name();\
Do task y;\
}
class A
{
VOID_FUNC(Do1)
VOID_FUNC(Do2)
};

关于C++ 将函数名传递给宏并调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36500204/

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