我有一个 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;
}
这给出了错误:
Error C2760 syntax error: unexpected token 'identifier', expected ')'
但是我不知道如何通过将静态函数的名称作为参数传递给模板来调用静态函数。请帮忙
最佳答案
您可以通过函数指针调用静态成员函数g
直接作为
g();
请注意 &ClassF::enumerateF
构造类型为 void(*)()
的函数指针,这与类类型无关ClassF
.这意味着,您不需要模板参数 F
作为类类型,在指定静态成员函数时已经指定。例如
template<typename FUNC>
void do_work(FUNC g)
{
g();
}
然后
do_work(&ClassF::enumerateF);
do_work(&ClassG::enumerateG);
关于c++ - 如何将 C++ 类的静态成员函数传递给模板并调用该函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53627436/