1

Poco::AutoPtrブーストの代替品に置き換えようとしています。これが私がこれまでに発見したことです:

私が持っているもの: 以下のクラスは で使用されていPoco::AutoPtrます。duplicate()実装とメソッドを使用して参照カウント メソッドを実装する必要がありrelease()ます。

私は、複数の継承と C++ ダイヤモンドの問題を抱えた複雑なクラス階層の上referece_counted.hで使用しています。Poco::AutoPtr

クラスの簡略化されたバージョンは、次のようになります

class A : virtual public ReferenceCounted
{
...
}

class B : public A
{
...
}

class C : public A
{
...
}

class D : public A, B
{
...
}

リストはさらにいくつかのレベルの深さまで続きます。Poco::AutoPtrこれを単純化された階層でリファクタリングする必要があることはわかっていますが、ブーストで適切に置き換えて最初に削除したいと思います。

これまでにわかったこと: boost::intrusive_ptrが、 の適切な代替となる最も近いスマート ポインターであることがわかりましたPoco::AutoPtr

ただし、intrusive_ptr には、ポインターを使用する必要があるクラスごとに特別に作成された intrusive_ptr_add_ref および intrusive_ptr_release メソッドが必要なため、これで適切なソリューションを実装することはできません。テンプレートを使用してみましたが、まだ適切な解決策が手元にありません。

また、もう 1 つの問題は、基本クラスから派生クラスに何度も型キャストする必要があることです。

intrusive_ptr は、この使用法に適したスマート ポインターですか? はいの場合..同じものを使用する方法について誰かが私に提案できますか?

4

1 に答える 1

1

ただし、intrusive_ptr には、ポインターを使用する必要があるクラスごとに特別に作成された intrusive_ptr_add_ref および intrusive_ptr_release メソッドが必要なため、これで適切なソリューションを実装することはできません。

いいえ、いいえ。難しいことではありません。Boostのドキュメントが言うように:

引数依存のルックアップをサポートするコンパイラでは、 intrusive_ptr_add_ref と intrusive_ptr_release は、それらのパラメーターに対応する名前空間で定義する必要があります。それ以外の場合、定義は名前空間 boost に入れる必要があります

これを試してください: main.cpp (「g++ main.cpp -o main -lboost_system」で正常にビルドされました)

#include <boost/intrusive_ptr.hpp>  

class MyObject
{
  public:
    void duplicate(){ 
       // ...
    }
    void release(){
       // ...
    }
};

namespace boost {

template <class T>
void intrusive_ptr_add_ref( T * po ) {
    po->duplicate(); // your internal realization
}

template <class T>
void intrusive_ptr_release( T * po ) {
    po->release(); 
}

}        

int main(int argc, char **argv)
{
    // ...
    boost::intrusive_ptr<MyObject> ptr( new MyObject );
    boost::intrusive_ptr<MyObject> ptr2 = ptr; // should work
}
于 2013-04-11T06:50:01.573 に答える