How to make a function return a pointer to a function? (C++)

C++Return ValueFunction Pointers

C++ Problem Overview


I'm trying to make a function that takes a character, then returns a pointer to a function depending on what the character was. I just am not sure how to make a function return a pointer to a function.

C++ Solutions


Solution 1 - C++

int f(char) {
    return 0;
}

int (*return_f())(char) {
    return f;
}

No, seriously, use a typedef :)

Solution 2 - C++

#include <iostream>
using namespace std;

int f1() {
	return 1;
}

int f2() {
	return 2;
}

typedef int (*fptr)();


fptr f( char c ) {
	if ( c == '1' ) {
		return f1;
	}
	else {
		return f2;
	}
}

int main() {
	char c = '1';
	fptr fp = f( c );
	cout << fp() << endl;
}

Solution 3 - C++

Create a typedef for the function signature:

typedef void (* FuncSig)(int param);

Then declare your function as returning FuncSig:

FuncSig GetFunction();

Solution 4 - C++

Assuming int f(char) and ret_f which returns &f.

C++98/C++03 compatible ways:

  • Ugly way:

    int (*ret_f()) (char) { return &f; }
    
  • With typedef:

    typedef int (sig)(char);
    
    sig* ret_f() { return &f; }
    

    or:

    typedef int (*sig_ptr)(char);
    
    sig_ptr ret_f() { return &f; }
    

Since C++11, in addition we have:

  • with decltype:

    decltype(&f) ret_f() { return &f; }
    
  • trailing return type:

    auto ret_f() -> int(*)(char) { return &f; }
    

    or:

    auto ret_f() -> decltype(&f) { return &f; }
    
  • typedef with using:

    using sig = int(char);
    
    sig* ret_f() { return &f; }
    

    or:

    using sig_ptr = int (*)(char);
    
    sig_ptr ret_f() { return &f; }
    

C++14 adds:

  • auto deduction:

    auto ret_f() { return &f; }
    

Solution 5 - C++

In C++11 you can use trailing return types to simplify the syntax, e.g. assuming a function:

int c(int d) { return d * 2; }

This can be returned from a function (that takes a double to show that):

int (*foo(double e))(int)
{
	e;
	return c;
}

Using a trailing return type, this becomes a bit easier to read:

auto foo2(double e) -> int(*)(int)
{
	e;
	return c;
}

Solution 6 - C++

Here is how to do it without using a typedef:

int c(){ return 0; }

int (* foo (void))(){  //compiles
return c;
}

Solution 7 - C++

Syntax for returning the function:

return_type_of_returning_function (*function_name_which_returns_function)(actual_function_parameters) (returning_function_parameters)

Eg: Consider the function that need to be returned as follows,

void* (iNeedToBeReturend)(double iNeedToBeReturend_par)
{
}

Now the iNeedToBeReturend function can be returned as

void* (*iAmGoingToReturn(int iAmGoingToReturn_par))(double)
{
   return iNeedToBeReturend;
}

I Felt very bad to learn this concept after 3 years of professional programming life.

Bonus for you waiting down for dereferencing function pointer.

C++ Interview questions

Example for function which returns the function pointer is dlopen in dynamic library in c++

Solution 8 - C++

typedef void (*voidFn)();

void foo()
{
}

voidFn goo(char c)
{
    if (c == 'f') {
        return foo;
    }
    else {
        //..
    }
    // ..
}

Solution 9 - C++

This is the code to show return of a function pointer. You need to define the "function signature" to return first:

int returnsOne() {
     return 1;
}

typedef int(*fp)();

fp returnsFPtoReturnsOne() {
    &returnsOne;
}

In your specific case:

fp getFunctionFor(char code) {
    switch (code) {
        case 'a': return &functionA;
        case 'b': return &functionB;
    }
    return NULL;
}

Solution 10 - C++

Check out this site - http://cdecl.org

Helps you convert english to C declarations and back!

Cool Stuff!

This link decodes the example in erikallen's answer. int (*return_f())(char)

Solution 11 - C++

Easiest way is to typedef the pointer-to-function type you want, and then use that

typedef void (*fnptr_t)(int, int);
fptr_t myfunc(char *) { ....

Solution 12 - C++

I prefer returning objects and call the operator(). This way your function can return an interface and all classes can inherit from this. That is, if you're using C++ and not C.

Then you can use the parametrized factor method to return the objects based on your input.

Solution 13 - C++

I'm assuming C here (no objects) :) :

// Type of function which takes a char and returns an int:
typedef int (*Func)(char a);

// An example of the function you're trying to return and which does something
// with char:
int exampleFunc(char a)
{
    return (int)(a + 42);
}

// The function returning the pointer to a function:
Func *returnAfunc(void)
{
    return exampleFunc;
}

Solution 14 - C++

Something like this

#include <iostream>

typedef char (*fn_ptr_t)(char);

char a_fn(char c)
{
  return c + 1;
}

char b_fn(char c)
{
  return c + 2;
}

fn_ptr_t
return_function(char c)
{
  fn_ptr_t result = 0;

  switch (c)
 {
    case 'a':
      result = a_fn;
      break;
    case 'b':
      result = b_fn;
      break;
 }
  
 return result;
}

int
main()
{
  fn_ptr_t fn = return_function('a');

  std::cout << "a(l) = " << (fn)('l') << std::endl;

  return 0;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser98188View Question on Stackoverflow
Solution 1 - C++erikkallenView Answer on Stackoverflow
Solution 2 - C++anonView Answer on Stackoverflow
Solution 3 - C++sean eView Answer on Stackoverflow
Solution 4 - C++Jarod42View Answer on Stackoverflow
Solution 5 - C++Superfly JonView Answer on Stackoverflow
Solution 6 - C++user2875784View Answer on Stackoverflow
Solution 7 - C++VINOTH ENERGETICView Answer on Stackoverflow
Solution 8 - C++ralphtheninjaView Answer on Stackoverflow
Solution 9 - C++Thomas JungView Answer on Stackoverflow
Solution 10 - C++m-sharpView Answer on Stackoverflow
Solution 11 - C++Chris DoddView Answer on Stackoverflow
Solution 12 - C++stefaanvView Answer on Stackoverflow
Solution 13 - C++Rutger NijlunsingView Answer on Stackoverflow
Solution 14 - C++BeanoView Answer on Stackoverflow