Вызов методов класса через указатель на функцию

413
26 февраля 2017, 08:47

Хочу реализовать возможность передавать в качестве аргумента функции указатель на метод разных классов.

class A1
{
public:
    void show()
    {
        std::cout << "A1" << std::endl;
    }
};
class B1
{
public:
    void show()
    {
        std::cout << "B1" << std::endl;
    }
};
void callf(void (*fp)())
{
    fp();
}
int main()
{
    callf(&A1::show);
    callf(&B1::show);
    return 0;
}
Answer 1

В вашем варианте забыта мелочь - то, что нестатическая функция-член требует наличия объекта, для которого вызывается. Так что просто так вызвать не получится, нужен объект.

Или статическая функция.

Вот так - запросто:

class A1
{
public:
    static void show()
    {
        std::cout << "A1" << std::endl;
    }
};
class B1
{
public:
    static void show()
    {
        std::cout << "B1" << std::endl;
    }
};
void callf(void (*fp)())
{
    fp();
}
int main()
{
    callf(&A1::show);
    callf(&B1::show);
    return 0;
}

Если все же не статические - то, например, вот:

class A1
{
public:
    void show()
    {
        std::cout << "A1" << std::endl;
    }
};
class B1
{
public:
    void show()
    {
        std::cout << "B1" << std::endl;
    }
};
template<class T>
void callf(T& t, void (T::*f)())
{
    (t.*f)();
}
int main()
{
    A1 a;
    B1 b;
    callf(a,&A1::show);
    callf(b,&B1::show);
    return 0;
}
READ ALSO
Вставка в unordered_map/set

Вставка в unordered_map/set

Если количество корзин в unordered map/set равно количеству элементов для вставки, гарантировано ли константное время вставки каждого элемента...

314
Процедура и событие mysql

Процедура и событие mysql

Создаю тестовые процедуру

279
Как бороться с Doze mode? [требует правки]

Как бороться с Doze mode? [требует правки]

Все телефоны засыпают когда экран выключен, не двигаются и данные не отсылаютсяКто может накинуть пример? Что причина почему так сложно заставить...

310
HMAC авторизация (HMAC-SHA256)

HMAC авторизация (HMAC-SHA256)

Реализовал на Java работаетНе могу перевести код на android

339