【问题标题】:C++ delivering function name to macro and calling itC ++将函数名称传递给宏并调用它
【发布时间】:2016-04-08 12:59:04
【问题描述】:

我有两节课。第一类做一些事情,然后调用第二类的方法。一流的每种方法都这样做。是否可以使用一些宏来自动化代码实现?

例子:

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

【问题讨论】:

  • 可能,但更可爱的方法是使用模板std::bindstd::function。我一定会赞成一个能勾勒出这一点的答案。
  • 似乎没有一种简单的方法可以创建您所要求的内容,而且不太简单的方法会很快变得丑陋;如果您解释为什么要这样做可能会有所帮助,因为可能有更好的方法来实现您的目的?看起来好像您想围绕现有类编写一个包装器,该类管理该类使用的某种资源,其中任务 x 将获取资源,而任务 y 将释放它。我想到的一个想法是,C++ 标准库通常允许自定义分配器,这些分配器实际上可能具有适应性,甚至适用于日志记录之类的事情。

标签: c++ function macros


【解决方案1】:

避免使用宏有很多很好的理由,其中之一是它们不尊重命名空间。

当您想重用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&amp;&amp; 替换为 const Fun&amp;

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

#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++11 添加了 lambda,但这只是构造函子的一种非常方便的方式。你可以在 1998 年手动滚动它们。
  • 当然可以@MSalters,好点!我已经稍微更新了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 2014-12-05
  • 2014-02-07
  • 1970-01-01
  • 2019-07-30
  • 2017-07-21
相关资源
最近更新 更多