пятница, 5 октября 2018 г.

Указатель на нестатическую функцию-член класса / non-static function member pointer

Отличий от обычного указателя на фунцию только два: как объявлять и как вызывать. Лучше всего пояснить на примере:


#include <iostream>
#include <string>

class MyClass
{
public:
    MyClass(int i) : m_i(i) {}
    void func() { std::cout << "m_i = " << m_i << "\n"; }

private:
    int m_i;
};

int main()
{
    MyClass obj1(1);
    MyClass obj2(2);
    void (MyClass::*fptr)() = &MyClass::func; // define and initialize function pointer
    obj1.func();
    ((&obj2)->*fptr)(); // use function pointer via an object pointer
}

Однако, с помощью более свежих версий C++ это можно упростить:


#include <iostream>
#include <string>

class MyClass
{
public:
    MyClass(int i) : m_i(i) {}
    void func() { std::cout << "m_i = " << m_i << "\n"; }

private:
    int m_i;
};

int main()
{
    MyClass obj1(1);
    MyClass obj2(2);
    auto fptr = &MyClass::func; // define and initialize function pointer
    obj1.func();
    ((&obj2)->*fptr)(); // use function pointer via an object pointer
}

Приятно, что можно забыть этот синтаксис указателя на функцию и отдать эту работу компилятору.