c++ - C++ 从类返回一个函数

  显示原文与译文双语对照的内容

我希望能够从类返回函数,因这里不需要通过返回类型来实现。

我有一个返回多个字符串的类。 相反,我希望返回多个函数。


#include <iostream>



class Handler


{


private:



public:


 int handleMessage(int code)


 {


 return code+1;


 }



};



void func1();


void func2();


void func3();



int main (int argc, char *argv[])


{


 Handler handle;


 int code = handle.handleMessage(0);


 if(code == 1)


 {


 func1();


 }


 return 0;


}



void func1(){ std::cout <<"1" <<std::endl;}


void func2(){ std::cout <<"2" <<std::endl;}


void func3(){ std::cout <<"3" <<std::endl;}



我想要的是:类 Handler 中的函数 handleMessage 返回一些东西,这样在我的主应用程序中,如果其他的。

因此,主要的外观如下:


function = handle.handleMessage(0); 



应用程序将选择要运行的函数。 例如:


function = handle.handleMessage(0);//will run func1 


function = handle.handleMessage(1);//will run func2



时间:

你可以修改成员函数,使它的返回函数指针,e.g.


using fptr = void (*)();



struct Handler


{


 fptr handleMessage (int code)


 {


 if (code == 0)


 return &func1;


 else if (code == 1)


 return &func2;


 else


 return &func3;


 }



};



可以按如下方式调用这里


 Handler handle;


 auto f = handle.handleMessage(0);


 f();



注意上 if - else if - else 调度是不理想的。 比较喜欢存储函数指针并将它的与一个 code 关联起来的数据成员,使用一个。

注意,当需要在将来返回有状态函数对象时,这种方法将失败。 然后,你需要接受 std::function,它可以用闭包或者自定义类型包含 operator() 重载。

有几种方法可以做到,最简单的方法,你可以使用 std::function 。 在这个例子中,我们为每个例子返回一个lambda函数。 你可以用刚才写的函数替换它。


class Handler {


public:


 std::function<void()> handleMessage(int code) {


 code = code + 1;//++code or whatever


 if (code == X) {


 return []() { std::cout <<"Cool! I'am x!" <<std::endl; };


 } else if (code == Y) {


 return []() { std::cout <<"Cool! I'am x!" <<std::endl; };


 } else if (...) {


. . .


 } else {


. . ..


 }


 }


};



然后你的主要功能变成:


int main (int argc, char *argv[]) {


 Handler handle;


 const auto func = handle.handleMessage(0);


 func();


 return 0;


}



你可以用存储不同函数的array 来替换 swith/if语句,如在注释中所提到的。

如果你不想支付关于 std::function的用法的额外虚函数调用,你可以使用下面的别名:


class Handler {


public:


 constexpr auto handleMessage(int code) {


 code = code + 1;//++code or whatever


 if (code == X) {


 return &func1;


 } else if (code == Y) {


 return &func2;


 } else if (...) {


. . .


 } else {


. . ..


 }


 }


};



...