2009-06-11 3 views
2

boost::bind обрабатывает boost::shared_ptr так же, как и исходные указатели.Есть ли специализация QPointer для 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"); 

Я хотел бы иметь boost::bind, который обрабатывает QPointers в качестве исходного указателя указателей.

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

ли кто-нибудь сделал специализацию QPointer?

Если вы не знаете, с чего начать или что нужно, чтобы специализироваться, я могу сделать это сам.

+0

Какую версию Qt вы используете? Документированный класс QPointer в версии 4.5 не имеет метода get. По его мнению, ваш желаемый синтаксис должен работать ... –

+0

Простите, что для lambda/shared_ptr, для QPointer это данные – TimW

+0

Шаблон Аргумент Дедукция означает, что аргументы QPointer имеют их тип, выведенный как QPointer , даже если у них есть оператор T *() const. – MSalters

ответ

5

Добавление этой перегрузки функции get_pointer следует сделать трюк:

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

Ницца, теперь я могу выбросить эти неприятные строки кода – TimW

+0

Это не специализация, это перегрузка, которая имеет несколько иные правила разрешения. Важно помнить, смешиваете ли вы оба (что вам не нужно, действительно). См. Herb Sutter: http://www.gotw.ca/publications/mill17.htm –

Смежные вопросы