簡體   English   中英

shared_ptr與模板

[英]shared_ptr with templates

如果我想創建一個指向struct的智能指針,我會這樣做:

    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?

如果您對B的固定模板類型感興趣,那么我將支持xtofl的答案。 如果您對以后指定B的模板參數感興趣,C ++不允許您這樣做(盡管它將在C ++ 0x中更改)。 通常你正在尋找的是這種解決方法:

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

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

(感謝UncleBens的改進。)

那就是

typedef shared_ptr< B<char> > B_Ptr;
B_Ptr p( new B<char> );
p->value = 'w';

你想要什么在C ++中是不可能的。 您想要“模板類型定義”,它將在C ++ 0x中稱為“別名聲明模板”:

template<typename T>
struct A {};

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

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

如果你真的想,你猜你可以在C ++ 98中用宏來做類似的事情。

另一個有用的方法是在B類模板中定義指針類型:

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

B<int>::SPtr p(new B<int>());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM