C++ C++;将函数名传递给宏并调用它
我有两节课。第一个类做一些事情,然后调用第二个类的方法。一流的每一种方法都能做到这一点。是否可以使用一些宏自动执行代码 例如:C++ C++;将函数名传递给宏并调用它,c++,function,macros,C++,Function,Macros,我有两节课。第一个类做一些事情,然后调用第二个类的方法。一流的每一种方法都能做到这一点。是否可以使用一些宏自动执行代码 例如: 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 } } 有可能以这种方式实施吗?这不起作用,但有点类似 #defi
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 x
和task 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();
});
}
};
可能吧,但更可爱的方法是使用模板、
std::bind
和std::function
。我一定会投票选出一个大致的答案。似乎没有一个简单的方法来创造你所要求的,而不是那么简单的方法很快变得丑陋;如果你解释一下你为什么要这样做,也许会有帮助,因为可能有更好的方法来实现你的目标?看起来好像您希望围绕一个现有类编写一个包装器,该类管理该类使用的某种资源,其中任务x将获取该资源,任务y将释放该资源。我想到的一个想法是,C++标准库一般允许自定义分配器,实际上可以是可适应的,甚至对于日志记录。C++ 11添加了lambda,但这只是构造函子的一种非常方便的方法。你可以在1998年手工翻滚它们。当然你可以@mAlters,说得好!我已经稍微更新了答案
#define VOID_FUNC(name) \
void name() {\
Do task x;\
ClassB b;\
b.name();\
Do task y;\
}
class A
{
VOID_FUNC(Do1)
VOID_FUNC(Do2)
};