函数包装器,函数私有类处理
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();
}
運行截圖
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的函数包装器,函数私有类处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 五菱荣光多少钱 了解五菱荣光的价格和配置
- 下一篇: 汽车底盘生锈怎么处理最合适?