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

标签 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;
}

这给出了错误:

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);

LIVE

关于c++ - 如何将 C++ 类的静态成员函数传递给模板并调用该函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53627436/

相关文章:

c++ - 如何在移动到shared_ptr后调用std::function

c++ - 重新定义 < 运算符以在字符串的 STL 算法中使用

c++ - 如果变量 a 是一个 char 数组是 char* p = &a 在 C++ 中定义的行为

c++ - 使用 StrTk String Toolkit Library 编写 CSV 的示例

用于使用开关展开循环的 C++ 模板?

推断使用的变量和依赖项的 Javascript 模板库

c# - 从静态类中选择一个随机静态变量

java - Spring 静态方法

java - 不能从静态上下文中引用非静态方法(方法名称())。为什么?

c++ - 什么是 "abstractions"?