6

如果我想创建一个指向 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 ?

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

如果您对 的固定模板类型感兴趣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 的改进。)

于 2009-11-10T18:50:42.997 回答
6

你想要的在 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 中做类似的事情。

于 2009-11-10T19:29:14.807 回答
3

另一种有用的方法是在 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 回答