首页 > 代码库 > loki仿函数原理
loki仿函数原理
loki仿函数原理
问题一:已知函数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);
}
报错。
编译器,就可以发现参数不一致的错误。
loki仿函数原理