c++ function pointers

Started by
23 comments, last by Pink Horror 9 years, 9 months ago

8 Years never needed a function pointer and I can't find a good example.

#include <iostream>
using namespace std;

// Basic Function
int AddOne(int a)
{
return a + 1;
}

// I want a function that returns a pointer to AddOne so I can call it

// This declaration does not work, what is the delcaration to return the function as a pointer.
int (*)(int) GiveMeFunctionPointer()
{
return &AddOne;
}

void main()
{
int (*foo)(int) = &AddOne; // Cool foo is a pointer to a function taking an int

int (*foo2)(int) = GiveMeFunctionPointer(); // This is what I want to use...

cout << foo(2);
system("pause");
}

NBA2K, Madden, Maneater, Killing Floor, Sims http://www.pawlowskipinball.com/pinballeternal

Advertisement
The easiest way is to use a typedef. Ex: typedef int (*function_type)(int). Then function_type GiveMeFunctionPointer()

I second SiCrane, If you want to know what it would look like without typedefs, though:


int AddOne(int a)
{
    return a + 1;
}

int (*GiveMeFunctionPointer())(int)
{
    return &AddOne;
}

Function pointer types are weird. It sort of goes around the function declaration.

Going to apply that to my actual code now..........does anyone know what that actually unrolls into? I don't mind typdef's for this case, I just hate typdef everything to a typdef item with a a typdef vector etc. I usually avoid them for readability.

// Obviously this doesnt work. Just curious what the signature without the typdef would be
int (*function_type)(int) GiveMeFunctionPointer()

{

}

Thanks.

NBA2K, Madden, Maneater, Killing Floor, Sims http://www.pawlowskipinball.com/pinballeternal

Function pointer types are weird. It sort of goes around the function declaration.

I did try something like that I guess I didnt have it correct. Either way typdef has worked in my engine. Sweet.

NBA2K, Madden, Maneater, Killing Floor, Sims http://www.pawlowskipinball.com/pinballeternal

Why not use std::function? It's a lot more flexible and safer.


I usually avoid them for readability.

That's odd. They were explicitly developed for and I use them for enhanced readability.

Then again, I second the use of std::function.

Stephen M. Webb
Professional Free Software Developer


8 Years never needed a function pointer and I can't find a good example.

Function pointers are kind of a weird tool in your toolbox. People are normally taught function pointers in an academic/abstract setting and then they are quickly forgotten because you can get by without them on a day to day basis. So here is a real world example.

I recently used function pointers (C# delegates) in a generic Credit Card Processing library that I wrote for my employer. It needed to work across all the C# projects who had different data-layers. I had a very specific series of events I wanted to happen when sending a credit card transaction as it was being used to make it bullet proof.

  1. Save the credit card transaction attempt BEFORE sending to the processor - Status: About to Send
  2. Send the transaction to the processor
  3. Save the result of the credit card transaction - Status: Approved/Denied

I could have solved this problem with documentation. Hey jerkies! Do it like I told you! But, if they didn't use it correctly, the burden of figuring out the problem was going to be on my shoulders anyway. So I'd rather be sure.

I could have solved the problem with direct saves through one of the data layers. But then I'd have to copy/paste the code in each project and rewrite the saves for each data layer. If there was a bug, I'd have to fix it in each copy of the code... Bleh.

So, I decided to use function pointers (C# delegates). The signature was:

bool PersistTransaction(CreditCardTransactionInfo)

I didn't care how they saved it, I just tell them the info they need to save. If there is a problem saving the data, they should return false to me so I don't try to go through with the transaction. This allowed them to use the data layer they felt like using. Heck, they could have even saved it to a file instead of into the database if they felt like it.The more junior programmers started murmuring amongst themselves and claimed I was a dark sorcerer...

In games, you might use function pointers to control simple AI movements for sidescrolling shooters. Basic enemies might just move straight, others might follow a sin curve, and others track the player like a heat seeking missile. You can solve this problem without function pointers, but it opens up some neat possibilities.

- Eck

EckTech Games - Games and Unity Assets I'm working on
Still Flying - My GameDev journal
The Shilwulf Dynasty - Campaign notes for my Rogue Trader RPG

You think this is weird, get into pointer to class methods :)

You think this is weird, get into pointer to class methods smile.png

Member function pointers aren't any more weird, they follow the same structure as function pointers after all:


typedef int (*function_type)(int); // function pointer
typedef int (SomeClass::*member_function_type)(int); // member function pointer

The only difference being you need an object or object pointer to call them on:


SomeClass object;
member_function_type member_func = &SomeClass::someMethod;
object.*member_func(25);
"I would try to find halo source code by bungie best fps engine ever created, u see why call of duty loses speed due to its detail." -- GettingNifty

This topic is closed to new replies.

Advertisement