代码之家  ›  专栏  ›  技术社区  ›  Ganesh Kamath - 'Code Frenzy'

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

  •  2
  • Ganesh Kamath - 'Code Frenzy'  · 技术社区  · 6 年前

    调用非静态函数:

    #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

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

    这会产生以下错误:

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

    1 回复  |  直到 5 年前
        1
  •  4
  •   songyuanyao    6 年前

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