1

私は小さなライブラリに取り組んでいます。そこでは、次の要件がありますclass X

  1. class Xを使用してのみ割り当て可能である必要がありますoperator new
  2. のすべての子は、class Xによってのみ暗黙的に割り当て可能になる必要がありますoperator new
  3. ヒープ割り当ての構文は洗練されている必要があります
  4. これを組み込むために既存のコードの多くを変更する必要はありません
  5. ある時点の後、class X自動として割り当てられるようにしたい場合。ここでも、多くのコードを変更する必要はありません

また、C ++ 0xソリューションを歓迎します(将来の使用のみ)。

[注:私は調査の一部を完了し、回答として投稿します(基本的なシナリオでテスト済み)]

4

1 に答える 1

3
// Dynamic.h
class OnlyDynamic
{
  template<class T> friend struct Dynamic;
  virtual void*** __Restriction () = 0;
};

template<class T>
class Dynamic : public T
{ 
  virtual void*** __Restriction () { return 0; }
  ~Dynamic();
public:
#ifdef Cpp0x
  template<typename... Args>
  Dynamic(Args... args) : T(args...) {}
#else
  Dynamic () {}
  template<typename A1> Dynamic(const A1 &a1) : T(a1) {}
  template<typename A1, typename A2> Dynamic(const A1 &a1, const A2 &a2) : T(a1,a2) {}
//...
  template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
  Dynamic(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6) : T(a1,a2,a3,a4,a5,a6) {}
#endif 
};

使用法:


class X動的に割り当て可能にするだけにしたいとします。単純に派生OnlyDynamicさせ (アクセス指定子は関係ありません)、 で割り当てる必要がありnew Dynamic<X>()ます。

例:

class Base {};

struct A : Base, OnlyDynamic  // <-- only inherit
{
  A (int i) {}
};

A *p = new Dynamic<A>(3);
delete p;

現在のところ、このソリューションですべての要件が満たされていることがわかります。

于 2011-08-13T07:44:44.480 に答える