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

报错。

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


相关文章
|
3月前
|
Prometheus 监控 Cloud Native
prometheus-operator入门使用上篇之ServiceMonitor
关于使用Prometheus Operator和Kube-Prometheus Stack进行监控的入门教程,涵盖了从部署到监控云原生和非云原生应用的详细步骤,以及监控失败的排查方法。
309 3
prometheus-operator入门使用上篇之ServiceMonitor
|
7月前
|
存储 数据处理 C++
C/C++ 数据结构设计与应用(三):运算符重载的策略与实践 (Operator Overloading Strategies and Practices)
C/C++ 数据结构设计与应用(三):运算符重载的策略与实践 (Operator Overloading Strategies and Practices)
54 0
|
7月前
|
存储 传感器 机器学习/深度学习
Java数组全套深入探究——进阶知识阶段6、三维数组以及更多维度数组的概念和用法
Java数组全套深入探究——进阶知识阶段6、三维数组以及更多维度数组的概念和用法
136 0
|
存储 运维 Kubernetes
K8s Operator总结----(一、)基础概念
如何基于k8s,进行二次定制化开发,系列文章,小试一下。
122 1
|
7月前
|
C++ 容器
【C++】STL容器——探究不同 [ 迭代器 ] 种类&在STL中的使用方式(15)
【C++】STL容器——探究不同 [ 迭代器 ] 种类&在STL中的使用方式(15)
|
Prometheus 监控 Cloud Native
Prometheus Operator配置原理
Prometheus Operator配置原理
103 0
|
存储 缓存 Kubernetes
聊一聊K8s Operator在日志采集器中的应用
Kubernetes提供了自定义资源(Custom Resource)和K8s Operator为应用程序的部署提供扩展。本文调研了K8s Operator在各个日志采集器中的应用场景与架构。
671 0
|
算法 编译器 C语言
【STL算法】for_each源码刨析及函数对象本质刨析
【STL算法】for_each源码刨析及函数对象本质刨析
198 0
【STL算法】for_each源码刨析及函数对象本质刨析

热门文章

最新文章