最开始接触到这个应该是在openGL的回调函数里面,当时对这种机制想了很久才明白,但也只是明白机制,具体的实现方法还是不清楚,哈哈哈,今天不小心看到了指针函数的用法,瞬间感觉会爱了!而且也见识到了抽象确实是c++中很重要的思想,实在是太有才了!
先贴出代码,然后解释
#include <iostream>
bool IsEven( const int num)
{
//==符号的优先级比&号的优先级高
return (num&1) == 0; //偶数为true,
// if( num & 1 == 0)
// std::cout<<"num:"<<num<<std::endl;
// std::cout<<"测试值:"<<(num & 1) <<std::endl;
// if(num%2 == 0)
// if(num & 1) //&运算
// return false;
// return true;
}
void swap(int &num1,int &num2)
{
int temp = num1;
num1= num2;
num2 = temp;
}
void Reorder(int *pData , unsigned int length, bool (*fun)(const int))
{
//只要使用指针就需要判断指针是否为空,或者无效
if(pData == NULL ||length <=0)
return ;
int *head;
int *tail;
head = pData;
tail = pData+length-1;
while(head < tail)
{
while(head <tail && !fun(*head) )
head++;
while(head <tail && fun(*tail) )
tail--;
if(head < tail) //异常判断
{
int temp = *head;
*head = *tail;
*tail = temp;
}
}
}
int main()
{
int pData[]={0,1,2,3,4,5};
int length = sizeof(pData)/sizeof(int);
Reorder(pData,length,IsEven);
for(int i=0;i<length;i++)
std::cout<<pData[i]<<" ";
std::cout<<std::endl;
return 0;
}
贴出上面的代码,一部分是作为对函数指针的用法的理解,还有一部分就是说对可能考虑到的功能的扩展,IsEven()函数是判断奇偶的,下面的Reorder函数是将数组中的奇数部分都放到前面,偶数部分都放到后面,本来是可以很直接的在Reorder函数里面判断奇偶然后交换,但是如果把需求改一改,需要将数组中所有的负数和非负数分别放在数组的前面和后面,或者3的倍数和非3的倍数分别放到前面和后面,虽然可以直接在Reorder函数中改动,但是如果我们写成上面的形式,定义一个函数指针,就可以直接写出判断分组的标准的函数,即判断负数和非负数,3的倍数或者非3的倍数的函数,然后通过一次调用Reorder函数将判断的分组的函数作为参数传递进去就ok了!顺利的结解决了这个问题,在openGL中同样如此,回调函数中有函数指针,我们定义自己的绘图函数,然后通过回调函数,实现不同的灵活的操作,这个在对不同但相似的功能有了更灵活的解决办法。真心觉得好用!不过同时也强调一定的综合抽象能力。