本想写个模板函数,然后导成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)
{............}
理解的不够深入还请多指导。