[学习]函数指针和模板混用实现forall
引言
在写对一些特殊数据结构,例如树、广义表等数据结构需要进行遍历。因此需要实现一个类似于forall
的函数来进行这样的遍历,例如在树中这样的函数称为Traverse
。然而在遍历过程中我们可能要定义相关的接口供调用,这样就要引入函数指针。
基本代码
#include <stdio.h>
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
template <class T>
int forall(T* any_list,size_t list_len,void (*function)(T&));
void print_decmical(int i)
{
printf("%d,", i);
return NULL;
}
int main(int argc, char** argv)
{
forall(arr, 10,print_decmical);
return 0;
}
template <class T>
int forall(T* any_list, size_t list_len, void (*function)(T&))
{
for (size_t i = 0; i < list_len; i++)
{
function(*any_list);
any_list++;
}
return 0;
}
下面对这个代码进行有限的解释
-
模板
template<class T>
T
代替了所有的class
类型,利用模板生成多个函数实例,因此可以减少代码量。 -
函数指针
//... ... void (*function)(T) //...
指示了此处的参数是一个接受一个参数,也就是遍历过程中产生的变量。由于只是对参数进行操作,因此只需要对引用进行读写即可,不需要返回值,因而设计为
void
返回类型。
作者发布、转载的任何文章中所涉及的技术、思路、工具仅供以安全目的的学习交流,并严格遵守《中华人民共和国网络安全法》、《中华人民共和国数据安全法》等网络安全法律法规。
任何人不得将技术用于非法用途、盈利用途。否则作者不对未许可的用途承担任何后果。
本文遵守CC BY-NC-SA 3.0协议,您可以在任何媒介以任何形式复制、发行本作品,或者修改、转换或以本作品为基础进行创作
您必须给出适当的署名,提供指向本文的链接,同时标明是否(对原文)作了修改。您可以用任何合理的方式来署名,但是不得以任何方式暗示作者为您或您的使用背书。
同时,本文不得用于商业目的。混合、转换、基于本作品进行创作,必须基于同一协议(CC BY-NC-SA 3.0)分发。
如有问题, 可发送邮件咨询.