Как передать статическую функцию-член класса c ++ в шаблон и вызвать функцию - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть программа на C ++, где я могу вызывать нестатические функции, вызывая объект.Вызов нестатической функции:

#include <iostream>
class ClassF {
public:
    void enumerateF() {
        std::cout << "f1\n";
        std::cout << "f2\n";
    }
};

class ClassG {
public:
    void enumerateG() {
        std::cout << "g1\n";
        std::cout << "g2\n";
    }
};

template<typename F, typename FUNC>
void do_work(FUNC g)
{
    F f;
    (f.*g)();
}

int main()
{
    do_work<ClassF >(&ClassF::enumerateF);
    do_work<ClassG >(&ClassG::enumerateG);
    return 0;
}

Это дает вывод:

f1

f2

g1

g2

Как вызывать статическую функцию:

#include <iostream>
class ClassF {
public:
    static void enumerateF() {
        std::cout << "f1\n";
        std::cout << "f2\n";
    }
};

class ClassG {
public:
    static void enumerateG() {
        std::cout << "g1\n";
        std::cout << "g2\n";
    }
};

template<typename F, typename FUNC>
void do_work(FUNC g)
{
    (F::*g)();
}

int main()
{
    do_work<ClassF >(&ClassF::enumerateF);
    do_work<ClassG >(&ClassG::enumerateG);
    return 0;
}

Это выдает ошибку:

Ошибка Синтаксическая ошибка C2760: неожиданный токен «идентификатор», ожидается ») '

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

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете вызывать статическую функцию-член через функцию poitner g напрямую как

g();

Обратите внимание, что &ClassF::enumerateF создает указатель на функцию с типом void(*)(), который не связан с классомвведите ClassF.Это означает, что вам не нужен параметр шаблона F в качестве типа класса, который был указан при указании статической функции-члена.например,

template<typename FUNC>
void do_work(FUNC g)
{
    g();
}

, а затем

do_work(&ClassF::enumerateF);
do_work(&ClassG::enumerateG);

LIVE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...