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)
};