![](/img/trans.png)
[英]Upcasting std::shared_ptr<Derived> to std::shared_ptr<Base> with templates
[英]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.