2009-11-10 54 views
5

如果我想创建一个智能指针,以结构我这样做:shared_ptr的使用模板

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?

回答

6

如果您对B的固定模板类型感兴趣,那么我会将我的支持放在xtofl的答案后面。如果您后来指定B的模板参数感兴趣,C++不允许您这样做(尽管它将在C++ 0x中更改)。通常,你要寻找的就是这种解决办法的:(感谢UncleBens的改进)

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

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

+1

这是过度复杂化一个简单的答案的好办法。 – 2009-11-10 19:07:13

+0

@Martin:怎么样?他对这个问题的措词很模糊,我不相信他在寻找一个固定的类型,而我的回答在他不是的情况下是一个合理的解决方案。 – fbrereto 2009-11-10 19:30:51

+2

或者:'template struct T_Ptr {typedef boost :: shared_ptr > type; }; T_Ptr :: type x;' – UncleBens 2009-11-10 19:49:10

6

这将是

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

您确定'B *'可以隐式转换为'shared_ptr >'吗? – sellibitze 2009-11-10 19:31:45

+1

经典shared_ptr错误。它应该是B_ptr p(新B )。 – 2009-11-10 20:01:15

+0

@丹:为什么?我可以把'int i = 0;'写成int i(0);'。 – xtofl 2009-11-10 20:25:04

4

你想要的是没有可能在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的宏类似的东西,如果你真的想。

2

另一个有用的方法是定义里面B级模板指针类型:

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

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