Pull to refresh

Синтаксис объявления указателей на функции в С++

Reading time1 min
Views31K
Когда я только начинал использовать С++, то всё время забывал синтаксис определения указателей на функции и особенно указателей на функции члены.

Позже узнал об одном небольшом lifehack'e, который помог мне избавиться от того что-бы держать в голове синтаксис определения указателей на ф-ции. Правда чуть позже этот всё само как-то осело у меня в голове и даже стало очевидно.

На днях показывал этот lifehack одному программисту и решил поделиться им здесь.

Что бы избежать долгих объяснений, приведу пример:
struct test
{
    virtual int foo( const test& ) const
    {
        return 0;
    };

    virtual ~test()
    {}
};

Допустим далее по коду нам нужно объявить указатель на test::foo.
Для того что-бы выяснить как он должен объявляться напишем следующее:
char c = &test::foo;

и попробуем собрать (для примера буду использовать компилятор от Microsoft, хотя проверял подобное на gcc и Comeau Online Compiller).

Получаем следующую ошибку:
error C2440: 'initializing' : cannot convert from 'int (__thiscall test::* )(const test &) const' to 'char'


Вот из этой ошибки мы и возьмем синтаксис объявления указателя на данный член ( явное указание типа вызова __thiscall — выкинем ):
int ( test::* )(const test &) const

Теперь добавим переменную и инициализацию:
int ( test::* func )(const test &) const = &test::foo;

Готово!
Tags:
Hubs:
+48
Comments46

Articles