Sign in to follow this  
Dospro

array of routine pointers

Recommended Posts

Hi. I have a strange question. Is there any way to create a lis or an array of pointers to functions. I mean, i need a list in which each member of the list is a pointer and points to a routine with all the same arguments, but different code. Thanks

Share this post


Link to post
Share on other sites
Sure.

// C++

#include <boost/function.hpp>

typedef boost::function<void (int, int)> sampleFun;

void foo(int x, int y) { }
void bar(int apples, int oranges) { }

sampleFun sampleFunArray[2] = { foo, bar };





// C


typedef void (*sampleFun)(int,int);

void foo(int x, int y) { }
void bar(int apples, int oranges) { }

sampleFun sampleFunArray[2] = { foo, bar };




[edit]
Usage in both cases (C as well as C++): sampleFunArray[index](arg0, arg1);
[/edit]

Share this post


Link to post
Share on other sites
Quote:
Original post by darookie
typedef boost::function<void (int, int)> sampleFun;


O_O How on Earth is the boost::function template declaration done such that you can put *that* in between the angle brackets?

Share this post


Link to post
Share on other sites
Quote:
Original post by Zahlman
Quote:
Original post by darookie
typedef boost::function<void (int, int)> sampleFun;


O_O How on Earth is the boost::function template declaration done such that you can put *that* in between the angle brackets?

That's just a regular type parameter. void (int, int) is a function type.

Share this post


Link to post
Share on other sites
Quote:
Original post by Polymorphic OOP
Quote:
Original post by Zahlman
Quote:
Original post by darookie
typedef boost::function<void (int, int)> sampleFun;


O_O How on Earth is the boost::function template declaration done such that you can put *that* in between the angle brackets?

That's just a regular type parameter. void (int, int) is a function type.
But functions aren't first-class objects in C++, I think. It must be some kind of specialized syntax. Weird.

Share this post


Link to post
Share on other sites
Anyway, here's how you do it without boost:
If your function is like this:

int myfunction1(int a, char b) { ...}
then you can make an array of pointers to functions that look like myfunction1:

int (*pointers[42])(int,char);

Ok, it's 3:30 AM, so it might be messed up. [wink]

Share this post


Link to post
Share on other sites
Quote:
Original post by Tron3k
But functions aren't first-class objects in C++, I think. It must be some kind of specialized syntax. Weird.

No, this requires no special syntax. All you are doing is passing a type as an argument, as I stated.


typedef void poo(int, int);

template< typename a >
class foo
{
typedef a test;
};

int main()
{
foo< void (int, int) > test;
}


should work

Share this post


Link to post
Share on other sites
Since when is void poo(int, int) a proper type, sure that you don't meant void (*poo)(int, int)?
At least GCC won't let me compile that example..

Share this post


Link to post
Share on other sites
Quote:
Original post by doynax
Since when is void poo(int, int) a proper type, sure that you don't meant void (*poo)(int, int)?
At least GCC won't let me compile that example..

void poo(int, int) isn't a proper type, void (int, int) is the proper type. The statement I provided typedefs the void (int, int) type to poo. If GCC doesn't allow it, then it is a fault with the compiler. Try Comeau or VC++ 7.1.

Another fun example that is fully standard that uses function types is:

template< void function() > // Expects a function that returns nothing and takes no parameters
class foo
{
public:
void do_stuff()
{
/* ... */
function();
/* ... */
}
};

void bar()
{
/* ... */
}

int main()
{
foo< bar > object;
object.do_stuff();
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this