如何将c ++类的静态成员函数传递给模板并调用该函数

时间:2018-12-05 07:43:46

标签: c++ templates static

我有一个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 :(得分:4)

您可以直接通过函数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