C++ template高级

来源:互联网 发布:信用卡淘宝退款 编辑:程序博客网 时间:2024/06/05 13:52

1、 Template 高级属性
1.1 可变参数

// CTemplatetest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include<Array>#include<cstdarg>  // C中是<stdarg.h> #include <initializer_list>#include <string.h>using namespace std;//***************************************偏特化***********************************************template<typename T>class A{public:     A(T para)    {        cout << "特化: " << para * para << endl;    }};template<>class A<double>{public:    A(double para)    {        cout << "偏特化: " << para * para << endl;    }};template<typename T>class A<T*>{public:    A(T para)    {        cout << "指针偏特化T*_T:" << para * para << endl;    }    A(T* para)    {        cout << "指针偏特化T*_T*:" << (*para) * (*para) << endl;    }};//***************************************模板可变参数***********************************************//属性1: 可变参数 //功能说明: 当模板参数不定时,可以使用这个属性,当然需要有退出口int TestPrintf(){ return 0; }template<typename T>int TestPrintf(T vag){    cout << "cur_vag: " << vag << endl;    return 1;}template< typename T, typename...Args>int TestPrintf(T To, Args...ag){    int temp = 0;    TestPrintf(To);    temp +=TestPrintf(ag...);    return temp;}//***************************************非模板可变参数***********************************************// va_list是一种数据类型,args用于持有可变参数。  // 定义typedef char* va_list;  //va_list args;// 调用va_start并传入两个参数:第一个参数为va_list类型的变量  // 第二个参数为"..."前最后一个参数名  // 将args初始化为指向第一个参数(可变参数列表)  //va_start(args, paramN);// 检索参数,va_arg的第一个参数是va_list变量,第二个参数指定返回值的类型  // 每一次调用va_arg会获取当前的参数,并自动更新指向下一个可变参数。  //va_arg(args, type);// 释放va_list变量  //va_end(args);int printftest(int num, ...){    int rusult = 0;    va_list  args;    va_start(args, num);    for (int i = 0; i < num; i++)    {        cout << va_arg(args, int) << endl;    }    va_end(args);    return rusult;}//***************************************非模板可变参数C++11***********************************************//如果函数的实参数量未知但是全部实参的类型都相同,我们可以使用initializer_list类型的形参(C++11新标准) 类似vectorstring func(initializer_list<string> strlist){    string str = "";    for (auto data : strlist)    {        cout << "data: " << data.c_str() << endl;        str  += data;    }    return str;}//**************************************template元编程**********************************//   对于模板元编程: 你所要的计算,在编译的时候,已经处理玩了,只需要在运行的时候输出结果即可!//   当硬件条件限制的情况下,除了优化算法,还有一种途径,那就是用模板元编程/*斐波那契数列6    H(1)=H(0)=1;7    H(N)= H(N-1)+H(N-2);*/template<int N>struct data{    enum{ value = data<N - 1>::value + data<N - 2>::value };};template<>struct data<0>{    enum{ value = 1 };};template<>struct data<1>{    enum{ value = 1 };};int _tmain(int argc, _TCHAR* argv[]){    cout << "****************偏特化测试*******************" << endl;    A<int> a1(99);    A<double> a2(9.9);    int* pdata = new int;    *pdata = 199;    A<int*> a3(199);    A<int*> a4(pdata);    cout <<endl << "****************可变参数测试*****************" << endl;    TestPrintf(0, 1, 2, 3, 4);    cout << endl << "****************非模板可变参数*****************" << endl;    printftest(4, 1, 2, 3, 22);    cout << func({ "This", " ", "is", " ", "C++" }).c_str() << endl;    cout << endl << "****************元对象编程*****************" << endl;    cout << "元对象:" << data<5>::value << endl;    getchar();    return 0;}
0 0
原创粉丝点击