在c++中遍历元组的基本方法,最终实现传入任意函数对象作用于元组的元素
打印元组
这里用cout举例,提供一种方法遍历元组的元素并依次输出,显然这需要可变参数和递归。首先定义一个辅助函数确定数组大小:(这里参考了Rajasekharan Vengalil的博客 )
|
|
print_tuple是一个结构体,不实现为函数的原因很简单:函数模板不能偏特化,如果用函数重载的方法来实现,由于参数不是常量表达式而无法编译。实现的方法如下:(注:可以用模板函数实现,但那可能需要index_sequence,这里的实现只需要c++11)
|
|
一个小测试:
|
|
输出:
|
|
(忘了std::boolnalpha,anyway…)
如果要倒序输出只需要把1和2调换就行了
过滤单一类型的数组元素
用模板递归检测元素类型,如果是需要过滤的类型则删去,最后返回过滤后的元组。
这里用到std::tuple_cat 用途顾名思义,用来连接元组
|
|
通过上面的print函数来测试一下:
|
|
输出:
~/dev/program/template$./filter
1 1 5 true false 1 really
1 1 5 1 really
所有布尔值都被过滤掉了
能否抽象出迭代器,传入函数对象?
这个问题我想了想,结合一些资料,认为是可以实现的。观察print的实现方法,其实和cout没有实际的耦合关系,所以可以把函数对象作为参数传进去。沿用print_tuple的结构,增加一个模板参数即可,实现函数for_each如下:
|
|
传入任意函数对象,比如lambda表达式:
|
|
这个实现使用了c++17标准的std::apply,但它可以被c++11简单地实现。当然这个实现还有简化的地方(老实说,不怎么优雅),比如可以直接用index_sequence展开,而不是递归。
c++的模板很奇妙,接下来有时间再深入了解。