2009-11-10 18 views
5

Wenn ich einen intelligenten Zeiger erstellen möchte ich struct tun, dass:shared_ptr mit Vorlagen

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

Aber, wenn ich ein Template-Struktur haben:

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

So kann ich folgendes schreiben wie folgt aus:

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

Und ich möchte folgendes schreiben:

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

Also, wie soll ich das B_Ptr erklären?

Antwort

6

Wenn Sie an einem festen Vorlagentyp für B interessiert sind, dann werfe ich meine Unterstützung hinter xtofl's Antwort. Wenn Sie später das Template-Argument B spezifizieren möchten, erlaubt C++ Ihnen das nicht (obwohl es in C++ 0x geändert wird). Typisch für das, was Sie suchen ist diese Art von Problem zu umgehen: (. Dank UncleBens für die Verbesserungen)

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

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

+1

Das ist ein guter Weg, um über erschwert eine einfache Antwort. –

+0

@Martin: Wie so? Seine Formulierung der Frage ist vage genug, dass ich nicht überzeugt bin, dass er nach einem festen Typ suchte, und meine Antwort ist eine vernünftige Lösung für den Fall, dass er nicht ist. – fbrereto

+2

Oder vielleicht: 'Vorlage Struktur T_Ptr {typedef boost :: shared_ptr > Typ; }; T_Ptr :: Typ X; ' – UncleBens

6

Das

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

Sind Sie sicher, dass 'B *' implizit in 'shared_ptr >' konvertiert werden kann? – sellibitze

+1

Classic shared_ptr Fehler. Es sollte B_ptr p sein (neu B ). –

+0

@Dan: warum? Ich kann auch 'int i = 0;' als 'int i (0);' schreiben. – xtofl

4

würde Was Sie wollen, ist noch nicht möglich in C++. Sie wollen „template typedefs“, die in C++ 0x als „alias Erklärung templates“ bekannt wird:

template<typename T> 
struct A {}; 

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

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

ich denke, man etwas ähnliches in C++ 98 mit einem Makro tun könnte, wenn Sie wirklich wollen.

2

Ein weiterer nützlicher Ansatz ist Zeigerart innen B-Klasse-Vorlage zu definieren:

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

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