Я пытаюсь сделать функцию, которая берет символ, а затем возвращает указатель на функцию в зависимости от того, какой был символ. Я просто не знаю, как заставить функцию вернуть указатель на функцию.
Как заставить функцию вернуть указатель на функцию? (С++)
Ответ 1
#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;
}
Ответ 2
int f(char) {
return 0;
}
int (*return_f())(char) {
return f;
}
Нет, серьезно, используйте typedef:)
Ответ 3
Создайте typedef для сигнатуры функции:
typedef void (* FuncSig)(int param);
Затем объявите свою функцию как возвращающую FuncSig:
FuncSig GetFunction();
Ответ 4
typedef void (*voidFn)();
void foo()
{
}
voidFn goo(char c)
{
if (c == 'f') {
return foo;
}
else {
//..
}
// ..
}
Ответ 5
Вот как это сделать, не используя typedef:
int c(){ return 0; }
int (* foo (void))(){ //compiles
return c;
}
Ответ 6
Синтаксис для возврата функции:
return_type_of_returning_function (*function_name_which_returns_function)(actual_function_parameters) (returning_function_parameters)
Например: Рассмотрим функцию, которая должна быть возвращена следующим образом:
void* (iNeedToBeReturend)(double iNeedToBeReturend_par)
{
}
Теперь функция iNeedToBeReturend может быть возвращена как
void* (*iAmGoingToReturn(int iAmGoingToReturn_par))(double)
{
return iNeedToBeReturend;
}
Я почувствовал себя очень плохо, чтобы изучить эту концепцию после трех лет профессиональной жизни программистов.
Бонус для вас, ожидая указателя функции разыменования.
Вопросы, связанные с С++ Интервью
Пример функции, возвращающей указатель функции, dlopen в динамической библиотеке в С++
Ответ 7
В С++ 11 для упрощения синтаксиса можно использовать типы возвращаемых возвратов. предполагая функцию:
int c(int d) { return d * 2; }
Это может быть возвращено из функции (которая принимает двойной, чтобы показать это):
int (*foo(double e))(int)
{
e;
return c;
}
Используя возвращаемый тип возврата, это становится немного легче читать:
auto foo2(double e) -> int(*)(int)
{
e;
return c;
}
Ответ 8
Посмотрите этот сайт - http://cdecl.org
Помогает вам преобразовать английский язык в декларации C и обратно!
Прохладный материал!
Эта ссылка декодирует пример в ответе erikallen. int (* return_f()) (char)
Ответ 9
Это код, показывающий возврат указателя функции. Вы должны сначала определить "подпись функции" для возврата:
int returnsOne() {
return 1;
}
typedef int(*fp)();
fp returnsFPtoReturnsOne() {
&returnsOne;
}
В вашем конкретном случае:
fp getFunctionFor(char code) {
switch (code) {
case 'a': return &functionA;
case 'b': return &functionB;
}
return NULL;
}
Ответ 10
Самый простой способ - напечатать требуемый тип указателя на функцию, а затем использовать
typedef void (*fnptr_t)(int, int);
fptr_t myfunc(char *) { ....
Ответ 11
Я предпочитаю возвращать объекты и вызывать оператор(). Таким образом, ваша функция может вернуть интерфейс, и все классы могут наследовать от этого. То есть, если вы используете С++, а не C.
Затем вы можете использовать метод параметризованного фактора для возврата объектов на основе вашего ввода.
Ответ 12
Что-то вроде этого
#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;
}
Ответ 13
Я думаю, это будет полезно, если кто-нибудь скажет мне, что случилось со следующим кодом (Я пытаюсь вернуть указатель на дочерний метод)
typedef int (Fred::*FredMemFn)(char x, float y); // Please do this!
typedef int (B::*FunctFactory)(char x, float y); //function factory
class Fred {
public:
int f(char x, float y)
{
return 0;
}
int g(char x, float y)
{
printf("ggg called ");
return 0;
}
int h(char x, float y)
{
return 0;
}
int i(char x, float y)
{
return 0;
}
virtual FunctFactory myFunctionFactory(int n) = 0;
// ^^ here smth is wrong
private:
};
class B : public Fred
{
public:
int secreetMethod(char x, float y)
{
return -100;
}
FunctFactory myFunctionFactory(int n)
{
printf("Got parameter %d", n);
FunctFactory funct = &B::secreetMethod;
return funct;
}
};
Ответ 14
Предполагая int f(char)
и ret_f
который возвращает &f
.
С++ 98/С++ 03 совместимые способы:
-
Гадкий путь:
int (*ret_f()) (char) { return &f; }
-
С typedef
typedef int (sig) (char);
sig * ret_f() {return & f; } }
или же
typedef int (*sig_ptr)(char);
sig_ptr ret_f() { return &f; }
Начиная с С++ 11, кроме того, у нас есть:
-
конечный тип возврата:
auto ret_f() -> int(*)(char) { return &f; }
или же
auto ret_f() -> decltype(&f) { return &f; }
-
typedef
сusing
:using sig = int(char); sig* ret_f() { return &f; }
или же
using sig_ptr = int (*)(char); sig_ptr ret_f() { return &f; }
С++ 14 добавляет:
-
auto
удержание:auto ret_f() { return &f; }
Ответ 15
Я предполагаю C здесь (нет объектов):):
// 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;
}