2009-11-10 15 views
5

Jeśli chcę tworzyć inteligentne wskaźnik do struct to zrobić:shared_ptr z szablonami

struct A 
    { 
     int value; 
    }; 
    typedef boost::shared_ptr<A> A_Ptr; 

Tak, można napisać następujące:

A_Ptr pA0(new A); 
    pA0->value = 123; 

Ale jeśli mam szablonu struct tak:

template<typename T> 
    struct B 
    { 
     T value; 
    }; 

I chcę napisać co następuje:

B_Ptr<char> pB0(new B<char>); 
    pB0->value = 'w'; 

Więc, jak powinienem zadeklarować B_Ptr?

Odpowiedz

6

Jeśli interesuje Cię stały typ szablonu dla B, wówczas rzucam moje wsparcie za odpowiedź xtofl. Jeśli jesteś zainteresowany późniejszym określeniem argumentu szablonu B, C++ nie pozwala ci tego zrobić (chociaż zostanie zmieniony w C++ 0x). Zazwyczaj to, czego szukasz tego rodzaju obejścia: (. Dzięki UncleBens dla ulepszeń)

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

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

+1

To dobry sposób na skomplikować prostą odpowiedź. –

+0

@Martin: Jak to zrobić? Jego sformułowanie pytania jest na tyle niejasne, że nie jestem przekonany, że szuka stałego typu, a moja odpowiedź jest rozsądnym rozwiązaniem w przypadku, gdy nie jest. – fbrereto

+2

A może: 'template struct T_Ptr {typedef boost :: shared_ptr > type; }; T_Ptr :: type x; ' – UncleBens

6

To byłoby

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

Czy jesteś pewien, że 'B *' jest niejawnie zamienne na 'shared_ptr >'? – sellibitze

+1

Błąd wspólnej shared_ptr. Powinien to być B_ptr p (nowy B ). –

+0

@ Dan: dlaczego? Równie dobrze mogę napisać 'int i = 0;' jako 'int i (0);'. – xtofl

4

Co chcesz nie jest jeszcze możliwe w C++. Chcesz „typedefs szablon”, które będą znane w C++ 0x jako „szablony deklaracji alias”:

template<typename T> 
struct A {}; 

template<typename T> 
using APtr = boost::shared_ptr<A<T>>; // <-- C++0x 

int main() { 
    APtr<int> foo; 
} 

Myślę, że można zrobić coś podobnego w C++ 98 z makra, jeśli naprawdę chcesz.

2

Innym przydatnym rozwiązaniem jest określić typ wskaźnika wewnątrz klasy B szablonu:

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

B<int>::SPtr p(new B<int>()); 
Powiązane problemy