shared_ptr с шаблонами - PullRequest
       16

shared_ptr с шаблонами

5 голосов
/ 10 ноября 2009

Если я хочу создать умный указатель на структуру, я делаю это:

    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 ]

6 голосов
/ 10 ноября 2009

Это было бы

typedef shared_ptr< B<char> > B_Ptr;
B_Ptr p( new B<char> );
p->value = 'w';
6 голосов
/ 10 ноября 2009

Если вас интересует фиксированный тип шаблона для 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 за улучшения.)

4 голосов
/ 10 ноября 2009

То, что вы хотите, еще не возможно в C ++. Вам нужны "template typedefs", который в 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 голосов
/ 23 августа 2012

Другой полезный подход - определить тип указателя внутри шаблона класса B:

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

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