C++模板参数为数组

来源:互联网 发布:2017年户外广告数据 编辑:程序博客网 时间:2024/05/23 17:54

本想写个模板函数,然后导成DLL,然后可以到处引用。可是后来发现,我的想法很天真。

由于C++是强类型语言,所以模板在用的时候必须确定其类型。而C++的模板只是一种语法糖,只不过是编译器在后台在做字符串替换罢了。

而dll导出的内容一定要是实实在在的,而模板必需要实例化成具体的东西,才能导出。

所以只能是在dll内部再写个类,把此类导出来,然后让此类内部去调用模板来实现。

在此写了两个参数为数组的模板,模板的功能也很简单,就查找数组中值的下标。

/**    * @brief 简单数组类型中检索相应值的位置,size直接可以由模板自己导出。         常用的简单数组类型比如:int[],double[]等    * @param[in] T 数组    * @param[in] size 数组大小    * @return int 值在数组的中的下标    */template <typename T,int size>int GetIndex(T (&vec)[size],T cmp){for (int i = 0; i <= size ;i++){if (vec[i] == cmp){return i;}}return -1;};

调用可以由以下:

int arr[10]={1,2,3,4,5,6,7,8,9,10};for(int i=0;i<10;i++){warr.Add(i);}//int b = FindIndx<int,sizeof(arr)/ sizeof(int)>(arr,9);int b = GetIndex(arr,9);

对于复杂的数组类型,如MFC中的CStringArray等则可以有以下的用法。

/**    * @brief 复杂数组类型中检索相应值的位置,size由数组的GetSize()方法得到。         常用的复杂数组类型比如:CDWordArray,CWordArray,CStringArray等    * @param[in] T 数组    * @param[in] size 数组大小* @param[in] U 被检索的值    * @return int 值在数组的中的下标    */template <typename T,typename U>int GetCArrayIndex(T& vec,U cmp){for (int i = vec.GetSize()-1; i >=0 ;i--){if (vec[i] == cmp){return i;}}return -1;};

调用如下:

CStringArray sarr;char szval[5];for(int i=0;i<10;i++){itoa(i,szval,10);sarr.Add(szval);}int c = GetCArrayIndex(sarr,"8");


对于复杂参数的模板,一定要记住对应的类型的方法。如CArray才有GetSize(),方法,而简单数组,没有GetSize()方法,所以在实现的时候要记住模板说对应的类型和方法。

当然,此两个函数中的返回值都是int,其实返回值类型也可以自己指定。只要在模板的定义的时候

template<typename T,typename U,typename R>中,R可以做为返回值的类型。

那么此方法就可以写成:

template<typename T,typename U,typename R>

R GetCArrayIndex(T& vec,U cmp)

{............}

理解的不够深入还请多指导。

原创粉丝点击