函数包装器,函数私有类处理

简介:  1、函数包装器 #include<iostream> #include<functional>   //函数包装器 //第一,设计执行接口,接口设计关卡(),计数 //第二,函数包装器依赖于函数模板,实现通用泛型 //第三,函数代码可以内嵌在另外一个函数,实现函数怀孕 //函数包装器,用于管理内嵌函数,外部


1、函数包装器

#include<iostream>

#include<functional>

 

//函数包装器

//第一,设计执行接口,接口设计关卡(),计数

//第二,函数包装器依赖于函数模板,实现通用泛型

//第三,函数代码可以内嵌在另外一个函数,实现函数怀孕

//函数包装器,用于管理内嵌函数,外部函数调用

 

//函数包装器, T数据类型, F是函数

template<typename T, typename F>

T run(T v, F f)

{

    static int count = 0;

    count++;//计数器

    std::cout << "run  一个参数的包装器 执行" << count << "" << std::endl;

    if (count > 1)

    {

        T  vx(0);

        return  vx;

    }

    return f(v);//函数传入参数

}

 

template<typename T, typename F>

T run(T v1, T v2, F f)

{

    return f(v1, v2);//函数传入参数

}

 

int  cheng(int a, int b)

{

    return a*b;

}

 

void main()

{

    using  std::cout;  //C++11. namespace,专门引用一个关键字,不需要std

    using  std::endl;

    using  std::function;

    //using namespace std;

    using  std::cin;

 

    double db = 12.9;//double *2

    int  num1 = 19;

    int  num2 = 29;

 

    //第一个double是返回值类型,第二个参数类型是参数类型

    function<double(double)> fun1 = [](double u)

    {

        return u * 2;

    };

    function<double(double)> fun2 = [](double u)

    {

        return u*u;

    };

    function<int(int, int)> fun3 = [](int u1, int u2)

    {

        return u1 + u2;

    };

    function<int(int, int)> fun4 = cheng; //fun4函数指针

 

    cout << run(db, fun1) << endl;//调用

    cout << run(db, fun2) << endl;//调用

    cout << run(num1, num2, fun3) << endl;//调用

    cout << run(num1, num2, fun4) << endl;//调用

    cin.get();//等价于你输入一字符getchar;

}

运行结果:

2.处理类的私有

#define _CRT_SECURE_NO_WARNINGS

#include<iostream>

#include<string>

 

//函数模板实现通用,可以根据自有数据类型,进行优化

 

//结构体可以直接赋值(没有私有变量)

 

//所有成员都是公有的类型可以赋值(一开始初始化)

//如果类有私有成员变量,不可以用{}初始化

 

//类的对象之间默认是可以直接赋值

 

//类,结构体都有一个默认赋值操作= 浅拷贝 ,交换数据

 

//深拷贝用的最多,函数模板的覆盖

class info

{

public:

    char name[40];

    char *p;

    int data;

private:

    int num;

public:

    void set(int X)

    {

        this->num = X;//通过接口设置私有变量

    }

    int get()

    {

        return this->num;//返回值,副本机制

    }

};

 

template<typename T>

void swap(T &a, T &b)

{

    std::cout << "通用函数模板" << std::endl;

    T temp = a;

    a = b;

    b = temp;//交换两个变量

}

 

//模板为空,明确类型,

template<>

void  swap(info &info1, info &info2)

{

    std::cout << "特有函数模板" << std::endl;

    //通用模板可以实现通用,针对自己的数据类型做出优化

    //计数器,对象交换计数器

    info temp = info1;

    info1 = info2;

    info2 = temp;

}

 

void main()

{

    info info1;

    info info2;

    std::strcpy(info1.name, "yincheng");

    std::strcpy(info2.name, "chengyin ");

    info1.data = 102;

    info2.data = 201;//初始化

    info1.p = new char[10];

    std::strcpy(info1.p, "魔王");

 

    //info2.p = nullptr;//C++的空指针

    info2.p = new char[100];

    std::strcpy(info2.p, "da魔王");

    info1.set(89);

    info2.set(98);

 

    swap(info1, info2);

 

    std::cout << info1.name << "   " << info1.data << "   " << info1.get() << std::endl;

    std::cout << info1.p << std::endl;

    std::cout << info2.name << "   " << info2.data << "    " << info2.get() << std::endl;

    std::cout << info2.p << std::endl;

    std::cin.get();

}

运行截图

 

 

 

 

 

 

目录
相关文章
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
288 116
|
19天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
408 38
Meta SAM3开源:让图像分割,听懂你的话
|
13天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
670 220
|
1天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
132 95
|
11天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1664 158
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
912 61