【问题标题】:C++ automatically generate wrapper for boost::make_sharedC++ 自动为 boost::make_shared 生成包装器
【发布时间】:2012-08-02 04:06:24
【问题描述】:

我广泛使用 boost 共享指针,因此我正在创建一个具有一堆有用/通用功能的类。作为其中的一部分,我想创建环绕 boost::make_shared 的静态成员函数来分配/构造对象的实例。例如,如果类 A 有构造函数:

class A {
  A(int arg1, double arg2);
  ...
}

那么围绕 make_shared 的相应包装将如下所示:

class A {
  A(int arg1, double arg2);
  static boost::shared_ptr<A> MakeShared(int arg1, double arg2) {
    return boost::make_shared<A, int, double>(arg1, arg2);
  }
  ...
}

然后要创建一个实例,您只需:

boost::shared_ptr<A> a_ptr = A::MakeShared(1, 2.3);

显然构造函数和 MakeShared 之间的关系是非常机械的,所以我的问题是是否/如何创建一个预处理器宏或基类,它可以自动为每个构造函数提供一个版本的 MakeShared?所以代码看起来像这样:

class A {
  A(int arg1, double arg2);
  A(int arg1, double arg2, bool arg3);
  ...
  DEFINE_CORRESPONDING_MAKE_SHARED_FUNCTIONS
  ...
}

使用 boost 预处理器库(或其他库)很好,但较大的项目还没有准备好使用 C++11,所以希望我们可以避免这种情况。

【问题讨论】:

标签: c++ boost shared-ptr


【解决方案1】:

这可以通过预定义数量的参数来实现:

#define DEFINE_MAKE_SHARED_FUNCTIONS(CLASS_TYPE) \
  template<typename A1> \
  static boost::shared_ptr<CLASS_TYPE> make_shared( const A1& a ) {\
      return boost::make_shared<CLASS_TYPE>( a );\
  }\
  template<typename A1,typename A2> \
  static boost::shared_ptr<CLASS_TYPE> make_shared( const A1& a, const A2& a2 ) {\
      return boost::make_shared<CLASS_TYPE>( a, b) );\
  }

如果你想变得花哨,你可以使用 boost 预处理器来自动化宏,但你也可以很容易地在一个宏中实现所有 N 个版本(可能编译得更快)。

您可以使用 veridic 模板来减少对宏的需求,但目前它不可移植(不支持 VC++)。

另外,我质疑这样做的必要性,因为 make_shared(args...) 本身就可以工作。

【讨论】:

  • 您还没有意识到您正在尝试在静态成员函数中使用 this 指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多