如果我想创建一个指向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?
答案 0 :(得分:6)
如果您对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的改进。)
答案 1 :(得分:6)
那将是
typedef shared_ptr< B<char> > B_Ptr;
B_Ptr p( new B<char> );
p->value = 'w';
答案 2 :(得分: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中用宏来做类似的事情,如果你真的想要的话。
答案 3 :(得分:3)
另一个有用的方法是在B类模板中定义指针类型:
template<typename T> struct B
{
typedef boost::shared_ptr< B<T> > SPtr;
T value;
};
B<int>::SPtr p(new B<int>());