0

ブースト共有ポインターを広範囲に使用しているため、便利な/一般的な機能を多数備えたクラスを作成しています。この一環として、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
  ...
}

ブースト プリプロセッサ ライブラリ (または他のライブラリ) を使用することは問題ありませんが、大規模なプロジェクトでは 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) );\
  }

ファンシーになりたい場合は、ブーストプリプロセッサを使用してマクロを自動化できますが、1つのマクロにすべてのNバージョンを簡単に実装できます(おそらくより高速にコンパイルできます)。

ベリディックテンプレートを使用してマクロの必要性を減らすことができますが、現時点では移植性がありません(VC ++サポートなし)。

また、make_shared(args ...)はすべて単独で機能するため、これが必要かどうか疑問に思います。

于 2012-08-02T04:18:10.160 に答える