博客
关于我
C++11——variadic template
阅读量:281 次
发布时间:2019-03-01

本文共 1914 字,大约阅读时间需要 6 分钟。

C++模板与递归实例解析

示例1:递归print函数

C++模板在函数中应用时,往往需要处理递归退出条件。以下是基于递归思想实现的print函数的两个不同版本:

版本1:带有两个模板参数

template
void print(const T& firstArg, const Types&... args);
  • 实现机制:该版本将第一个参数单独作为输出,递归调用处理剩余的参数。
  • 递归退出条件:当只有一个参数时,直接输出该参数并结束递归。

版本2:带有多个模板参数

template
void print(const Types&... args);
  • 实现机制:该版本在每次递归中输出固定的字符串"test",然后继续处理剩余的参数。
  • 注意事项:由于版本1比版本2更特化,实际开发中版本2通常不会被调用。

示例使用

int main() {    print(7.5, "hello", bitset<16>(377), 42);    system("pause");    return 0;}

示例2:实现带有initializer_list的max函数

在C++11及更高版本中,initializer_list 提供了一种灵活的数据结构,可以用于实现通用max函数。以下是一个基于递归思想的实现示例:

递归max函数

template
_T my_max(initializer_list<_T>_l) { return *my_max_element(_l.begin(), _l.end());}
  • 递归机制:调用标准库中的std::max_element函数来找到最大值。
  • 优势:简化了手动实现max元素查找的复杂性。

标准库实现对比

cout << my_max({1, 2, 5, 3, 7, 9, 5}) << endl;cout << max({1, 2, 5, 3, 7, 9, 5}) << endl;
  • 输出结果:两次调用结果相同,展示了实现的一致性。

示例3:可变参数模板实现max函数

可变参数模板技术可以用来简化递归函数的实现。以下是一个基于可变参数的max函数实现:

int maximum(int n, Args... args) {    return max(n, maximum(args...));}
  • 递归退出条件:当只有一个参数时,直接返回该参数值。
  • 灵活性:支持任意数量的参数,适用于多种数据类型。

示例使用

int main() {    cout << maximum(1, 2, 5, 3, 7, 9, 5) << endl;    system("pause");    return 0;}

示例4:实现tuple数据结构

tuple数据结构可以通过嵌套或继承的方式实现。以下是一个基于继承的实现示例:

class my_tuple {private:    Head head;    Tail... tail;public:    my_tuple() : head(), tail(...) {}    template
my_tuple(Head v, Tail... vtail) : head(v), my_tuple
(vtail...) {} Head head() { return m_head; } template
my_tuple
& tail() { return *this; }};

示例使用

int main() {    my_tuple
t(41, 6.3, "nico"); cout << t.head() << endl; // 41 cout << t.tail().head() << endl; // 6.3 cout << t.tail().tail().head() << endl; // nico system("pause"); return 0;}

总结

以上示例展示了C++模板与递归技术在不同场景下的应用。从递归print函数到initializer_list的max函数,再到可变参数模板和tuple的实现,每一份代码都体现了模板与递归的强大之处。通过灵活运用这些技术,可以简化实现复杂逻辑的同时提高代码的可维护性和扩展性。

转载地址:http://zamt.baihongyu.com/

你可能感兴趣的文章
Nginx配置TCP代理指南
查看>>
Nginx配置——不记录指定文件类型日志
查看>>
Nginx配置代理解决本地html进行ajax请求接口跨域问题
查看>>
Nginx配置参数中文说明
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
NHibernate学习[1]
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>