0

我正在广泛使用 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,所以希望我们可以避免这种情况。

4

1 回答 1

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...) 本身就可以工作。

于 2012-08-02T04:18:10.160 回答