6

構造体へのスマート ポインターを作成する場合は、次のようにします。

    struct A
    {
        int value;
    };
    typedef boost::shared_ptr<A> A_Ptr;

だから、私は次のように書くことができます:

    A_Ptr pA0(new A);
    pA0->value = 123;

しかし、そのようなテンプレート構造体がある場合:

    template<typename T>
    struct B
    {
        T value;
    };

そして、次のように書きたいと思います。

    B_Ptr<char> pB0(new B<char>);
    pB0->value = 'w';

では、どのように B_Ptr を宣言すればよいでしょうか?

4

4 に答える 4

8

それは

typedef shared_ptr< B<char> > B_Ptr;
B_Ptr p( new B<char> );
p->value = 'w';
于 2009-11-10T18:52:50.623 に答える
7

の固定テンプレートタイプに興味がある場合は、Bxtoflの回答の背後に私のサポートを投げます。後でのテンプレート引数を指定することに興味がある場合B、C ++ではこれを行うことができません(ただし、C ++ 0xで変更されます)。通常、探しているのはこの種の回避策です。

template <typename T>
struct B_Ptr
{
    typedef boost::shared_ptr< B<T> > type;
};

B_Ptr<char>::type pB0 = ...;

(改善してくれたUncleBensに感謝します。)

于 2009-11-10T18:50:42.997 に答える
6

あなたが望むことはC++ではまだ可能ではありません。C++0xでは「エイリアス宣言テンプレート」として知られる「テンプレートtypedef」が必要です。

template<typename T>
struct A {};

template<typename T>
using APtr = boost::shared_ptr<A<T>>;  // <-- C++0x

int main() {
    APtr<int> foo;
}

本当にやりたいのであれば、マクロを使ってC++98で同様のことを行うことができると思います。

于 2009-11-10T19:29:14.807 に答える
3

もう 1 つの便利な方法は、B クラス テンプレート内でポインター型を定義することです。

template<typename T> struct B
{
   typedef boost::shared_ptr< B<T> > SPtr;
   T value;
};

B<int>::SPtr p(new B<int>());
于 2012-08-23T13:09:00.950 に答える