ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++第09课 模板 (二)

2021-09-06 23:31:28  阅读:310  来源: 互联网

标签:... 09 Ty int args C++ template data 模板


1.可变参模板函数

//列表方式展开
template<class _Ty>
void print(_Ty data)
{
    cout << data << endl;
}
template<class ...Args>
void printData(Args... args)
{
    int array[] = { (print(args),0)... };
}
//递归方式展开
void printData2()
{
    cout << endl;
}

template<class _Ty,class ...Args>
void printData2(_Ty data, Args ...args)
{
    cout << data << "\t";
    printData2(args...);
}

//求任意个整数的和
//1.递归展开
int sum()
{
    return 0;
}
template<class _Ty,class ...Args>
int sum(_Ty data, Args ...args)
{
    return data + sum(args...);
}
//2.列表展开
template<class _Ty>
_Ty sum2(_Ty data)
{
    return data;
}
template<class ...Args>
int sum1(Args... args)
{
    int array[] = { (0,sum2(args))... };
    int sum = 0;
    for (int i : array)
    {
        sum += i;
    }
    return sum;
}

int main()
{
    printData(1, "love", 2.2f, 'A');
    printData2(1, "love", 2.2f, 'A');
    cout << sum(1, 2, 3, 4, 5) << endl;
    cout << sum1(1, 2, 3, 4, 5) << endl;
    return 0;
}

 

2.可变参数模板类

//模板特化+递归的方式展开参数包
template <class ...Args> 
class Tup;
//特化
template <>
class Tup<> {};
//递归方式实现
template <class _Ty,class ...Args>
class Tup<_Ty, Args...> 
{
public:
    Tup(_Ty data, Args ...args) :data(data), args(args...) {}
    _Ty& head() 
    {
        return data;
    }
    Tup<Args...>& next() 
    {
        return args;
    }
protected:
    _Ty data;
    Tup<Args...> args;
};
void testTup() 
{
    Tup<int, string, char> tup(1, "string", 'A');
    cout << "第一个参数:" << tup.head() << " 第二个参数:" << tup.next().head()
        << " 第三个参数:" << tup.next().next().head() << endl;
    Tup<string,int,int,int,int> mm("mm",18,98,88,88);
}

//模板特化+继承的方式展开参数包
template <class ...Args>
class Test;

template <>
class Test<> 
{
};
/*
template <class _This, class... _Rest>
class tuple<_This, _Rest...> : private tuple<_Rest...>
*/
template <class _Ty,class ...Args>
class Test<_Ty, Args...> :public Test<Args...>
{
public:
    Test(_Ty data, Args... args) :data(data), Test<Args...>(args...) {}
    _Ty& head() 
    {
        return data;
    }
    Test<Args...>& next() 
    {
        return *this;
    }
protected:
    _Ty data;
};
void testTest() 
{
    Test<int, string, char> test(1, "string", 'A');
    cout << "第一个参数:" << test.head() << " 第二个参数:" << test.next().head()
        << " 第三个参数:" << test.next().next().head() << endl;
    Test<string, int, int, int, int> mm("mm", 18, 98, 88, 88);
}
int main() 
{
    testTup();
    testTest();
    tuple<int, string, char> testTuple;
    return 0;
}

 

标签:...,09,Ty,int,args,C++,template,data,模板
来源: https://www.cnblogs.com/creature-lurk/p/15236269.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有