问题一:已知函数Fun有2个参数,请完成CTestFunctor类,使得CTestFunctor的()实际调用Fun,部分代码如下:
#include <iostream> using namespace std ; class CTestCommand { public: void operator()(int x,double y) { cout << "CTestCommand的operator" << x << " " << y << endl; } }; void Fun(double x,int y) { cout << "全局函数" << x << " " << y << endl; } void main() { CTestCommand cmd ; CTestFunctor<CTestCommand,void,int,double> f(cmd); f(3,4.5); CTestFunctor<void (*)(double,int),void,int,double> f2(Fun); f2(100,1000); }
参考答案:
template<typename FNU,typename R,typename P1,typename P2> class CTestFunctor { public: CTestFunctor(const FNU& fun):m_fun(fun) { }; R operator()(P1 p1,P2 p2) { return m_fun(p1,p2); } protected: FNU m_fun; };
问题二,参数类型不定,但不超过5个。
#include <iostream> using namespace std ; class CTestCommand { public: void operator()() { cout << "无参数" << endl ; } void operator()(int x ) { cout << "1参数" << endl ; } int operator()(double x,int y) { cout << "2参数" << x << " " << y << endl; return 2; } void operator()(char x,char y ,char z ) { cout << "3参数" << x <<" " << y << " " << z << endl ; } void operator()(short x,short y,short z,short w) { cout << "4参数" << x <<" " << y << " " << z << " " << w << endl ; } void operator()(short x,short y,short z,short w,short v) { cout << "5参数" << x <<" " << y << " " << z << " " << w << " " << v << endl ; } }; class NullType { NullType();//构造函数只有声明,没实现,所以不会被调用 }; template<typename FNU,typename R,typename P1=NullType,typename P2=NullType,typename P3=NullType,typename P4=NullType,typename P5=NullType> class CTestFunctor { public: CTestFunctor(const FNU& fun):m_fun(fun) { }; R operator()() { return m_fun(); }; R operator()(P1 p1) { return m_fun(p1); }; R operator()(P1 p1,P2 p2) { return m_fun(p1,p2); }; R operator()(P1 p1,P2 p2,P3 p3) { return m_fun(p1,p2,p3); }; R operator()(P1 p1,P2 p2,P3 p3,P4 p4) { return m_fun(p1,p2,p3,p4); }; R operator()(P1 p1,P2 p2,P3 p3,P4 p4,P5 p5) { return m_fun(p1,p2,p3,p4,p5); }; protected: FNU m_fun; }; void main() { CTestCommand cmd ; CTestFunctor<CTestCommand,void> f0(cmd); f0(); CTestFunctor<CTestCommand,void,int> f1(cmd); f1(1); CTestFunctor<CTestCommand,int,double,int> f2(cmd); int x = f2(1,2); CTestFunctor<CTestCommand,void,char,char,char> f3(cmd); f3(1,2,3); CTestFunctor<CTestCommand,void,short,short,short,short> f4(cmd); f4(1,2,3,4); CTestFunctor<CTestCommand,void,short,short,short,short,short> f5(cmd); f5(1,2,3,4,5); }
问题三:
假定有默认值。
CTestCommand改成如下:
class CTestCommand { public: void operator()(short x=1,short y=2,short z=3,short w=4,short v=5) { cout << "5参数" << x <<" " << y << " " << z << " " << w << " " << v << endl ; } };
f2改成如下:
CTestFunctor<CTestCommand,int,double,int> f2(cmd); f2(1,2);
运行正常。
问题四:
看看容错性如何?
class CTestCommand { public: void operator()(short x,short y) { cout << "5参数" << x <<" " << y << endl ; } };
假定少一个参数,我们看会报错吧。
void main() { CTestCommand cmd ; CTestFunctor<CTestCommand,void,short> f1(cmd); f1(1); }
报错。
void main() { CTestCommand cmd ; CTestFunctor<CTestCommand,void,short,short> f1(cmd); f1(1); }
报错
void main() { CTestCommand cmd ; CTestFunctor<CTestCommand,void,short> f1(cmd); f1(1,2); }
报错。
编译器,就可以发现参数不一致的错误。