繁体   English   中英

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

[英]How to pass Static member function of a c++ Class to template and invoke the function

我有一个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语法错误:意外的令牌'标识符',预期为')'

但是我不知道如何通过将静态函数的名称作为参数传递给模板来调用静态函数。 请帮忙

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

生活

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM