泛型仿函数二
来源:互联网 发布:剑三藏剑正太脸数据 编辑:程序博客网 时间:2024/04/30 11:25
转发接口解决两个问题:参数类型与个数问题
泛型自动生成需要的那个
template <typename R ,class TList>
class Functor
{
typedef TList ParmList;
typedef typename TypeAtNonStrict<TList,0,EmptyType>::Result Parm1;
typedef typename TypeAtNonStrict<TList,1,EmptyType>::Result Parm2;
.....
public:
R operator()()
{
return (*spImpl_)();
}
R operator()(Parm1 p1)
{
return (*spImpl_)(p1);
}
R operator()(Parm1 p1,Parm2 p2)
{
return (*spImp1_)(p1,p2);
}
};
仿函数处理
Functor 被Fun参数化的templated构造函数
template <typename R ,class TList>
class Functor
{
...as above...
public:
templatte <class Fun>
Functor(const Fun&fun);
}
FunctorImpl<R,TList>派生class template FunctorHandler,保存一个型别为Fun的对象,并将operator()转发给该对象,
防止定义太多,Functor封装参数,并成为参数传递进去
template <class ParentFunctor,typename Fun>
class FunctorHandler:public FunctorImpl<typename ParentFunctor::ResultType,typename ParentFunctor::ParmList>
{
public :
typedef typename ParentFunctor::ResultType ResultType;
FunctorHandler(const Fun& fun):fun_(fun){}
FunctorHandler * Clone()const
{
return new FunctorHandler(*this);
}
ResultType operator()()
{
return fun_();
}
ResultType operator()(typename ParentFunctor::Parm1 p1)
{
return fun_(p1);
}
ResultType operator()(typename ParentFunctor::Parm1 p1,
typename ParentFunctor::Parm2 p2)
{
return fun_(p1,p2);
}
private:
Fun fun_;
};
如此,构造函数改写如下:
template <typename R,class TList>
template <typename Fun>
Functor <R,TList>::Functor(const Fun&fun)
:spIml_(new FunctorHandle<Functor,Fun>(fun));
{
}
实际为一个指向FunctorHandle 对象
泛函数=函数指针+型别推倒机制
当函数指针重载的时候,出现推导不明确,可采用赋值和转型
int main()
{
typedef void (*TpFun)(int ,double);
TpFun pF= TestFunction;
Functor<void,int,double>cmd1(pF);
cmd1(4,4.5);
Functor<void ,int ,double>cmd2(
static_cast<TpFun>(TestFunction));
cmd2(4,4.5)
}
泛型自动生成需要的那个
template <typename R ,class TList>
class Functor
{
typedef TList ParmList;
typedef typename TypeAtNonStrict<TList,0,EmptyType>::Result Parm1;
typedef typename TypeAtNonStrict<TList,1,EmptyType>::Result Parm2;
.....
public:
R operator()()
{
return (*spImpl_)();
}
R operator()(Parm1 p1)
{
return (*spImpl_)(p1);
}
R operator()(Parm1 p1,Parm2 p2)
{
return (*spImp1_)(p1,p2);
}
};
仿函数处理
Functor 被Fun参数化的templated构造函数
template <typename R ,class TList>
class Functor
{
...as above...
public:
templatte <class Fun>
Functor(const Fun&fun);
}
FunctorImpl<R,TList>派生class template FunctorHandler,保存一个型别为Fun的对象,并将operator()转发给该对象,
防止定义太多,Functor封装参数,并成为参数传递进去
template <class ParentFunctor,typename Fun>
class FunctorHandler:public FunctorImpl<typename ParentFunctor::ResultType,typename ParentFunctor::ParmList>
{
public :
typedef typename ParentFunctor::ResultType ResultType;
FunctorHandler(const Fun& fun):fun_(fun){}
FunctorHandler * Clone()const
{
return new FunctorHandler(*this);
}
ResultType operator()()
{
return fun_();
}
ResultType operator()(typename ParentFunctor::Parm1 p1)
{
return fun_(p1);
}
ResultType operator()(typename ParentFunctor::Parm1 p1,
typename ParentFunctor::Parm2 p2)
{
return fun_(p1,p2);
}
private:
Fun fun_;
};
如此,构造函数改写如下:
template <typename R,class TList>
template <typename Fun>
Functor <R,TList>::Functor(const Fun&fun)
:spIml_(new FunctorHandle<Functor,Fun>(fun));
{
}
实际为一个指向FunctorHandle 对象
泛函数=函数指针+型别推倒机制
当函数指针重载的时候,出现推导不明确,可采用赋值和转型
int main()
{
typedef void (*TpFun)(int ,double);
TpFun pF= TestFunction;
Functor<void,int,double>cmd1(pF);
cmd1(4,4.5);
Functor<void ,int ,double>cmd2(
static_cast<TpFun>(TestFunction));
cmd2(4,4.5)
}
0 0
- 泛型仿函数二
- 二、函数
- 函数(二)
- 二、函数
- 函数(二)
- 函数【二】
- 函数二
- Cognos函数(二) - 宏函数
- asp常用函数(二)
- 字符串函数(二)
- 递归函数汇总(二)
- xsl函数二
- 几个函数(二)
- 常用javascript函数(二)
- LoadRunner常用函数二
- ORACLE 函数 大全(二)
- PB函数大全二
- API函数导航(二)
- SVN学习(三)-常用操作
- 扫描器的使用--Java基础019
- Android开发——相册拍照_04.图片上传
- Spring MVC 下Session监听器监听设置小细节
- eclipse的一些快捷键记录
- 泛型仿函数二
- Java虚拟机运行时数据区域
- javaee 数据库连接池C3P0
- sublime中node测试环境
- Android设计模式及面向对象原则
- codeforces 123E. Maze (概率与期望)
- 四则运算表达式 逆波兰表达式
- linux打印全部make编译信息
- 封装自己的jquery插件