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);

}

报错。

编译器,就可以发现参数不一致的错误。

时间: 2024-10-30 10:30:58

loki仿函数原理的相关文章

读loki有感,TYPEList原理

问题一,简化版的TYPEList,只支持int型 template<int n> class TYPEList { public: int Head; TYPEList<n-1> Tail; }; template<> class TYPEList<0> { public: int Tail; int Head; }; 测试代码 TYPEList<0> l0; l0.Head = 1; l0.Tail = 2; TYPEList<2>

[GeekBand] STL 仿函数入门详解

本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格  http://www.leavesite.com/ 前言:本文主要通过关联容器set解释下仿函数的实现及工作原理. 一.STL六大组件简介 1.Containers(容器):各种数据结构,如Vector,List,Deque,Set,Map,用来存放数据2.Algorithms(算法):如. Sort,Search.3.Iterators(

虚拟地球原理与实现

一.引言 目前与地理信息相关的信息绝大多数也是通过投影变换以平面的方式管理和使用,这已不能满足大范围甚至全球多分辨率海量数据管理的要求. 2005年,美国谷歌公司推出了一款免费的虚拟地球浏览软件GoogleEarth(谷歌地球),给了人们一种全新的感受,数据动态装载.地形渐进描绘.多重细节层次(LOD: Levels of Detail)和虚拟现实表现等已成为虚拟地球的典型技术特征. 因而构建一个虚拟地球,需要解决以下几个问题:全球角度空间数据模型的构造,海量地理空间数据(包括地形.影像)的组织

C++设计模式类库 Loki介绍与用法

C++设计模式类库 Loki介绍与用法 Loki是由Andrei编写的一个与<Modern C++ Design>(C++设计新思维)一书配套发行的C++代码库.它不仅把C++模板的功能发挥到了极致,而且把类似设计模式这样思想层面的东西通过库来提供.本篇文章介绍如何利用Loki来轻松地实现一些设计模式. 由于Loki使用了大量牛X到爆的模板技巧,对编译器的要求是很苛刻的,官方兼容列表里只列出了VC7.1以上版本及GCC3.4以上版本.如果你象我一样喜欢用C++Builder6或VC6,可以去下

Loki之Funtion

阅读Loki中Funtion源码之后的个人理解,该库归纳起来可以说有三层(C++设计新思维列举到2个参数,此处列举到3个参数),要记住C++的模板其实就是C语言高级的宏定义,如果用户没有用到对应的模板编译器是不会生成对应代码的. 第一层: template <typename R, template <class, class> class ThreadingModel> class FunctorImpl<R, NullType, ThreadingModel> :

hash_map原理及C++实现

一.数据结构:hash_map原理 hash_map基于hash table(哈希表).哈希表最大的长处,就是把数据的存储和查找消耗的时间大大减少,差点儿能够看成是常数时间:而代价不过消耗比較多的内存.然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的.另外,编码比較easy也是它的特点之中的一个. 其基本原理是:使用一个下标范围比較大的数组来存储元素.能够设计一个函数(哈希函数,也叫做散列函数).使得每个元素的keyword都与一个函数值(即数组下标.hash值)相相应,于是用这

【C++】【lambda】lambda函数介绍和个人理解(2)——lambda与仿函数

前言: 本来是打算11月末的时候写这篇文章,结果一直拖拖拖拖拖啊啊啊啊啊事多啊事多!OK这是对lambda的分析的第二篇,第三篇准备给大家带来一些"语法甜点",不过实在是不知道什么时候能够写完=.=到时候再说 导航: lambda函数介绍和个人理解(1)--初识lambda lambda函数介绍和个人理解(2)--lambda与仿函数 lambda函数介绍和个人理解(3)--lambda的语法甜点 正文: 好点的编程语言一般都有好的库支持,C++也不例外.C++语言在标准程序库STL中

JVM原理讲解和调优

一.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译.Java语言使用Java虚拟机屏蔽了与具体平台相关的信息

小米手环 / 运动手环 记步功能原理

很多朋友是第一次接触像小米手环这类运动计步产品,对于那么轻盈小巧的手环能够精准计步,甚至能详细完整的记录睡眠时间觉得非常神奇,本文就和大家详细说说在看不见的小米手环背板下,它是怎么工作的. 1. 手机上的运动步数是怎么来的? A:简单来说:小米手环能够精准计步由硬件和软件算法两方面组成,缺一不可. 硬件 是指小米手环里内置的那枚强悍的三轴加速度传感器ADXL362 (注1),军用级,大家知道想要达到军用级,这得有多苛刻.其实三轴加速度传感器不神秘,在大多数中高档手机里都有配备加速度传感器,只是在