Russian Qt Forum

Qt => Общие вопросы => Тема начата: Sergeich от Апрель 17, 2008, 12:50



Название: QTypeInfo
Отправлено: Sergeich от Апрель 17, 2008, 12:50
Наткнулся в qglobal.h на кусок кода, где определяется является ли данный тип указателем:
Код:
template <typename T> char QTypeInfoHelper(T*(*)());
void* QTypeInfoHelper(...);

template <typename T>
class QTypeInfo
{
public:
    enum {
        isPointer = (1 == sizeof(QTypeInfoHelper((T(*)())0))),
        //.........
    };
};
Нихрена не могу понять как это работает  :-\ Может кто просветит неразумного?


Название: Re: QTypeInfo
Отправлено: Tonal от Апрель 17, 2008, 13:23
Работает так:
Если тип T поданный в QTypeInfo является указателем, то при вычислении компилятором выражения sizeof(QTypeInfoHelper((T(*)())0))) выбирается шаблонная версия QTypeInfoHelper и выражение принимает значение sizeof(char), т.е 1.
В противном случае выбирается QTypeInfoHelper с многоточием.

Техника называется SFINAE (http://"http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error")


Название: Re: QTypeInfo
Отправлено: Sergeich от Апрель 17, 2008, 14:59
А что значит конструкция T(*)() ?


Название: Re: QTypeInfo
Отправлено: Tonal от Апрель 17, 2008, 15:43
Указатель на функцию без параметров которая возвращает T.


Название: Re: QTypeInfo
Отправлено: Sergeich от Апрель 17, 2008, 18:40
Указатель на функцию без параметров которая возвращает T.
мля, точно... торможу :)


Название: Re: QTypeInfo
Отправлено: Sergeich от Апрель 18, 2008, 10:03
Спасибо! Асилил :)