C++ template高级

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新标准) 类似vector

string 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值