указатель на функцию-член, который возвращает тот же тип указателя на функцию-член - PullRequest
7 голосов
/ 03 июля 2010

Я хотел бы объявить указатель на функцию-член в C ++, который возвращает тот же тип указателя на функцию-член

Это не работает:

class MyClass { 
public: 
        typedef FunctionPtr (MyClass::*FunctionPtr)(); 
}

Кто-нибудь знает решение

Ответы [ 3 ]

5 голосов
/ 03 июля 2010

AndreyT ссылается на лучший ответ на GotW # 57 , так что я мог бы повторить его здесь:

class MyClass {  
public: 
        struct FunctionPtrProxy;
        typedef FunctionPtrProxy (MyClass::*FunctionPtr)();  

        struct FunctionPtrProxy
        {
               FunctionPtrProxy(FunctionPtr pp ) : p( pp ) { }
               operator FunctionPtr() { return p; }
               FunctionPtr p;
        }

} 
5 голосов
/ 03 июля 2010

Нет способа достичь именно этого. Фактически, функции-члены здесь не имеют значения: нет способа объявить обычную функцию, которая возвращает указатель на свой собственный тип функции. Объявление будет бесконечно рекурсивным.

В случае обычной функции вы можете использовать тип void (*)() в качестве «универсального» типа указателя на функцию (точно так же, как void * часто используется для типов данных). Для указателей на функции-члены типа void (A::*)(). Вы должны использовать reinterpret_cast для этой цели, хотя. Однако такое использование (преобразование туда-обратно) оказывается тем, когда определяется поведение reinterpret_cast.

Конечно, вы будете вынуждены использовать приведение для преобразования указателя в и из этого типа. AFAIK, существуют элегантные основанные на шаблонах решения с промежуточным временным объектом шаблона, который выполняет приведение.

Возможно, вы захотите взглянуть на эту Полученную запись .

P.S. Обратите внимание, что использование типа void * в качестве промежуточного типа для указателей на функции запрещено языком. Хотя такое незаконное использование может показаться «работающим» с обычными указателями на функции, у него нет абсолютно никаких шансов работать с указателями на функции-члены. Указатели на функции-члены обычно являются нетривиальными объектами, размер которых превышает размер указателя void *.

0 голосов
/ 03 июля 2010

То, что вы пытаетесь сделать, невозможно, тип возвращаемой функции - это тип самой функции, который еще не известен, поэтому он ведет к бесконечному циклу.

...