//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy
//This program intents to show the use of function pointers
//This program also uses priority queues
#include<iostream>
#include<queue>
using namespace std;
typedef int (*fpRegCb)(int* i_p, int index);
int funcA(int *val, int index)
{
cout<<"Func A: index = "<<index<<" val = "<<*val<<endl;
return (*val + 10);
}
int funcB(int *val, int index)
{
cout<<"Func B: index = "<<index<<" val = "<<*val<<endl;
return (*val + 15);
}
class someSimpleListType
{
private:
someSimpleListType(); //This cant be used
public:
int index;
int *value;
fpRegCb callback;
someSimpleListType(fpRegCb cb, int *val, int idx):value(val),index(idx)
{
callback = cb;
};
//< operator is overloaded for use with priority queues. This will
//decide the priority of the new element, where it should be placed
const bool operator <(const someSimpleListType& sLT) const
{
return (index < sLT.index);
}
};
priority_queue <someSimpleListType> someSimpleList;
int main()
{
int index=0;
int *a=new int(22);
int *b=new int(37);
int *c=new int(62);
//The higher the priority, higher it is in the queue
someSimpleList.push(someSimpleListType(funcA, a, index++));
someSimpleList.push(someSimpleListType(funcB, b, index++));
someSimpleList.push(someSimpleListType(funcB, c, index++));
//The last push will end up top of queue as index(priority) is greatest
//Lets get all the elements from the list and process them
cout<<"Test 1"<<endl;
while(!someSimpleList.empty())
{
someSimpleListType &sLT = someSimpleList.top();
cout<<"Callback["<<sLT.index<<"] = "<<sLT.callback(sLT.value,sLT.index)<<endl;
someSimpleList.pop();
}
//Since the priority queue is now empty, push some more elements
someSimpleList.push(someSimpleListType(funcA, a, index++));
someSimpleList.push(someSimpleListType(funcB, b, index++));
someSimpleList.push(someSimpleListType(funcB, c, index++));
//This time we will only process funcB and ignore funcA
cout<<endl<<"Test 2"<<endl;
while(!someSimpleList.empty())
{
someSimpleListType &sLT = someSimpleList.top();
if(sLT.callback == funcB)
{
cout<<"Callback["<<sLT.index<<"] = "<<sLT.callback(sLT.value,sLT.index)<<endl;
}
someSimpleList.pop();
}
return 0;
}
Wednesday 4 March 2009
Simple Function Pointers example
This example shows how function pointers work. There is also an example of how priority queues work.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment