2009-06-11 4 views
2

boost::bind gère boost::shared_ptr de la même manière que les pointeurs bruts.Y at-il une spécialisation QPointer pour 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"); 

J'aimerais avoir une boost::bind qui gère QPointers comme pointeur pointeurs brut.

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"); 

Est-ce qu'il ya quelqu'un qui a fait la spécialisation pour QPointer? Si vous ne savez pas par où commencer ou ce qui doit être spécialisé, je peux le faire moi-même.

+0

Quelle version de Qt utilisez-vous? La classe QPointer documentée dans la version 4.5 n'a pas de méthode get. De l'apparence de cela votre syntaxe désirée devrait fonctionner ... –

+0

Désolé obtenir est pour lambda/shared_ptr, pour QPointer c'est données – TimW

+0

Modèle Argument Déduction signifie que les arguments QPointer ont leur type déduit comme QPointer , même s'ils ont un opérateur T *() const. – MSalters

Répondre

5

L'ajout de cette surcharge de la fonction get_pointer devrait faire l'affaire:

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

Nice, maintenant je peux jeter ces lignes de code méchant – TimW

+0

Ce n'est pas une spécialisation, c'est une surcharge, qui a des règles de résolution légèrement différentes. Important de se rappeler si vous mélangez les deux (ce que vous ne devriez pas, vraiment). Voir Herb Sutter: http://www.gotw.ca/publications/mill17.htm –