2018-05-17

函数包装器与模板

#include<functional> //函数包装器
using std::function;

int add(int a, int b)
{

    return a + b;
}

template<class T,class F>
T run(T t1,T t2,F f)
{
    return f(t1,t2);

}
void main()
{
    function<int(int, int)>fun1 = add; //包装函数
    function<int(int, int)>fun2 = [](int a, int b)->int {return a - b;};

   cout<<   run(10, 19, fun1)<<endl;  //默认推导  原生优先
   cout << run<   int, function<int(int, int)>   >(10, 19, fun1) << endl;

    cin.get();

}

函数模板的嵌套

#include<vector>
#include<list>

template<class T1,class T2>
void showall(vector<T1>v,list<T2>l)
{

    vector< vector<T1>v >v1; //二维数组

    for (auto i : v)
    {
        cout << i << endl;
    }
    for (auto i : l)
    {
        cout << i << endl;
    }


}

void main()
{
    vector<int> myint{ 1,2,3,4,5 };
    vector<char>mych{ 'A','B','C' };

    list<int> myint1{ 1,2,3,4,5 };
    list<char>mych1{ 'A','B','C' };

    showall(myint, mych1);

    cin.get();
}

模板与引用

//变量 左值引用 右值引用 原则不能冲突
//ref 变量 -> 左值引用
//move 左值引用 右值引用

//模板自带引用的话 无论& ,&&都是原本
//T t , ref都是原本 否则是副本


template<class T>
void print1(T t) //ref
{
    cout << "  void print(T t) " << endl;
    t += 1;
    cout << t << endl;
}

template<class T>
void print2(T&t)
{
    cout << "  void print(T&t) " << endl;
    t += 1;
    cout << t << endl;
}


template<class T>
void print3(T&&t) //move
{
    cout << "  void print(T&&t) " << endl;
    t += 1;
    cout << t << endl;
}

template<class T>
void printint(T&&t) //move
{
    cout << "  void print(T&&t) " << endl;
    t += 1;
    cout << t << endl;
}


void main()
{
    int data (100);
    int &rdata(data);
    int &&rrdata(data+1);

    //print1(data);   //副本 
    //print1(ref(data)); //原本 引用包装  包装变量或者引用
    //print1(rdata); //副本
    //print1(ref(rdata)); //原本
    //print1(rrdata); //右值 引用 内存保存的临时值  副本
    //print1(ref(rrdata));//原本

    
    //print2(data);  //模板自带引用的情况下 都是原本
    //print2(rdata);
    //print2(rrdata);

    print3(data);  //模板自带引用的情况下 都是原本
    print3(rdata);
    print3(rrdata);


    cout << "data:" << data << endl;
    cout << "rdata:" << rdata << endl;
    cout << "rrdata:" << rrdata << endl;

    int num = 10;
    int&rnum(num);
    printint(move(num));   //移动语义 数据 左值引用转换为右值引用
    printint(move(rnum));


    cin.get();
}

模板的重载


//函数重载: 参数个数 类型 顺序
//与返回值无关
//有指针优先匹配指针
template<class T>
void go(T t1)
{
    cout <<"TTTTTTTTTTTTTTTTTT"<< endl;
    cout << t1 << endl;
}

template<class T>
void go(T* t1)
{
    cout << "***************"<< endl;
    cout << *t1 << endl;
}

void main()
{
    int*p = new int[5]{ 1,2,3,4,5 };
    go(p[0]);
    go(p);
    go(&p); //地址趋向地址

    cin.get();
}

模板的类型默认参数和函数参数默认函数

//保证所有的类型参数可以推导 默认 明确
//函数参数遵循函数默认值规则

template <class T=int,int n=10>  //模板参数可以有默认值
void bobo(T t)
{
    cout << n << endl;
    cout << bobo << endl;
}

//节约输入参数  类型参数 可以指定或者不指定  任意 填充从左向右  必须覆盖类型参数
template<class T1=int,class T2=int,class T3=int,class T4=int>
//函数参数 默认统一在右边  至少要把不默认的填充了才能调用
void boda(T1 t1,T2 t2=5.7,T3 t3=6.66,T4 t4=9.99)
{
    
    cout << t1<<"  "<<t2<< "  " << t3<< "  " << t4<< endl;
}

void mainr9()
{

    bobo<>(50.50); //自动推理
    bobo<int,250>(50.50);

    boda<int,int,int,int>(10);  //类型必须明确才能执行



    cin.get();

}

函数模板的指针匹配


//模板自动匹配*多的
template<class T>
void com(T*p)
{
    cout << "*:    " ;
    cout << typeid(p).name() << end;

}

template<class T>
void com(T**p)
{
    cout << "**:    ";
    cout << typeid(p).name() << end;

}
void main()
{
    int *p(nullptr);
    int **pp(nullptr);
    int ***ppp(nullptr);
    com(p);
    com(pp);
    com(ppp);

    cin.get();
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,548评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,069评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,985评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,305评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,324评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,030评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,639评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,552评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,081评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,194评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,327评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,004评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,688评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,188评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,307评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,667评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,337评论 2 358

推荐阅读更多精彩内容