#include <iostream>
#include <string>
using namespace std;
class RunClass{
public:
RunClass() {}
~RunClass() {}
public:
int FuncTest1(const std::string &str);
int FuncTest2(const std::string &str);
};
int RunClass::FuncTest1(const std::string &str)
{
cout << "RunClass::FuncTest1 :" << str << endl;
}
int RunClass::FuncTest2(const std::string &str)
{
cout << "RunClass::FuncTest2 :" << str << endl;
}
class Dispatcher {
public:
Dispatcher() {}
~Dispatcher() {}
public:
int HandleProcess(int c);
private:
template<class ProcessClass>
int DoProcess(int (ProcessClass::*ProcessFunc)(const std::string &str), const std::string &str);
};
template<class ProcessClass>
int Dispatcher::DoProcess(int (ProcessClass::*ProcessFunc)(const std::string &str), const std::string &str)
{
ProcessClass obj;
int ret = (obj.*ProcessFunc)(str);
return ret;
}
int Dispatcher::HandleProcess(int c)
{
int ret = 0;
if (c == 1) {
ret = DoProcess<RunClass>(&RunClass::FuncTest1, std::string("HandleProcess c == 1"));
} else if (c == 2) {
ret = DoProcess<RunClass>(&RunClass::FuncTest2, std::string("HandleProcess c == 2"));
} else {
cout << "Unknow c = " << c << endl;
}
return ret;
}
int main(int argc, char *argv[])
{
Dispatcher d;
d.HandleProcess(1);
d.HandleProcess(2);
d.HandleProcess(3);
return 0;
}
编译输出:
RunClass::FuncTest1 :HandleProcess c == 1
RunClass::FuncTest2 :HandleProcess c == 2
Unknow c = 3