2009-06-11 4 views
2

boost::bind behandelt boost::shared_ptr auf die gleiche Weise wie rohe Zeiger.Gibt es eine QPointer Spezialisierung für boost :: bind

QObject * object(new QObject); 
boost::shared_ptr<QObject> sharedObject(new QObject); 

bind(&QObject::setObjectName, object, _1)("name"); 
bind(&QObject::setObjectName, sharedObject, _1)("name"); 

Ich würde gerne ein boost::bind haben, die QPointers als rohe Zeiger Zeiger verarbeitet.

QPointer<QObject> guardedObject(new QObject);  
// i want to write it like this 
bind(&QObject::setObjectName, guardedObject, _1)("name"); 
//now i have to do it like this 
bind(&QObject::setObjectName, bind(&QPointer<QObject>::data, guardedObject), _1)("name"); 

Gibt es jemanden, der Spezialisierung für QPointer gemacht hat?

Wenn nicht, wissen Sie, wo ich anfangen soll oder was spezialisiert werden muss, damit ich es selbst machen kann.

+0

Welche Version von Qt verwenden Sie? Die dokumentierte QPointer-Klasse in Version 4.5 hat keine get-Methode. Vom Aussehen her sollte Ihre gewünschte Syntax funktionieren ... –

+0

Sorry get ist für Lambda/shared_ptr, für QPointer sind es Daten – TimW

+0

Template Argument Deduction bedeutet, dass QPointer Argumente ihren Typ als QPointer abgeleitet haben, auch wenn sie einen Operator haben T *() const. – MSalters

Antwort

5

Addiert man diese Überlastung der get_pointer Funktion sollte es tun:

namespace boost { 
    template<typename T> T * get_pointer(QPointer<T> const& p) 
    { 
     return p; 
    } 
} 
+1

Schön, jetzt kann ich diese fiesen Codezeilen wegwerfen – TimW

+0

Dies ist keine Spezialisierung, es ist eine Überladung, die etwas andere Auflösungsregeln hat. Wichtig daran zu erinnern, wenn man beides mischt (was man eigentlich nicht sollte). Siehe Herb Sutter: http://www.gotw.ca/publications/mill17.htm –