함수가 함수에 대한 포인터를 반환하는 방법은 무엇입니까? (C ++)
문자를 취한 다음 문자가 무엇인지에 따라 함수에 대한 포인터를 반환하는 함수를 만들려고합니다. 함수가 함수에 대한 포인터를 반환하는 방법을 잘 모르겠습니다.
int f(char) {
return 0;
}
int (*return_f())(char) {
return f;
}
아니요, 진지하게 typedef를 사용하십시오. :)
#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;
}
함수 시그니처에 대한 typedef를 만듭니다.
typedef void (* FuncSig)(int param);
그런 다음 함수를 반환 할 함수를 반환합니다.
FuncSig GetFunction();
typedef void (*voidFn)();
void foo()
{
}
voidFn goo(char c)
{
if (c == 'f') {
return foo;
}
else {
//..
}
// ..
}
다음은 typedef를 사용하지 않고 수행하는 방법입니다.
int c(){ return 0; }
int (* foo (void))(){ //compiles
return c;
}
함수 반환 구문 :
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;
}
저는 3 년의 전문적인 프로그래밍 생활을 마치고이 개념을 배우는 것이 매우 기분이 좋지 않습니다.
역 참조 함수 포인터를 기다리는 동안 개체.
함수 포인터를 반환하는 함수의 예 는 C ++의 동적 라이브러리에서 dlopen입니다.
C ++ 11에서는 후행 반환 유형을 사용하여 구문을 단순화 할 수 있습니다 (예 : 함수 가정).
int c(int d) { return d * 2; }
이 함수에서 반환 될 수 있습니다 (이를 나타냅니다. 내기 위해 double을 사용합니다).
int (*foo(double e))(int)
{
e;
return c;
}
후행 반환 유형을 사용하면 읽기가 조금 더 좋습니다.
auto foo2(double e) -> int(*)(int)
{
e;
return c;
}
함수 포인터의 반환을 완성 코드입니다. "함수 서명"을 먼저 지불해야합니다.
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;
}
이 사이트를 확인하십시오 -http : //cdecl.org
영어를 C 선언으로 변환하고 그 결과로 변환합니다!
멋진 것!
이 링크는 erikallen의 답변에있는 예제를 사용합니다. int (* return_f ()) (char)
가장 쉬운 방법은 원하는 함수 포인터 유형을 typedef 한 다음 사용하는 것입니다.
typedef void (*fnptr_t)(int, int);
fptr_t myfunc(char *) { ....
객체 반환을 선호하고 operator ()를 호출합니다. 이렇게하면 함수가 인터페이스를 반환하고 모든 클래스가이 인터페이스를 상속 할 수 있습니다. 즉, C가 아닌 C ++를 사용하는 경우입니다.
그런 다음 매개 변수화 된 인수 방법을 사용하여 입력에 따라 객체를 반환 할 수 있습니다.
가정 int f(char)
및 ret_f
어떤 돌아갑니다 &f
.
C ++ 98 / C ++ 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; }
C ++ 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; }
C ++ 14는 다음을 추가합니다.
auto
공제:auto ret_f() { return &f; }
이 같은
#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;
}
나는 여기에 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;
}
참고 URL : https://stackoverflow.com/questions/997821/how-to-make-a-function-return-a-pointer-to-a-function-c
'ProgramingTip' 카테고리의 다른 글
'this'포인터는 컴퓨터 메모리에 어디에 저장합니까? (0) | 2020.11.22 |
---|---|
소수점 앞의 자릿수 가져 오기 (0) | 2020.11.22 |
DataContractSerializer를 사용하여 생성 화하지만 역화 할 수 없음 (0) | 2020.11.22 |
If, Else, For, Foreach 등의 절을 접는 방법은 무엇입니까? (0) | 2020.11.22 |
매개 변수를 ActiveModel Serializer에 전달하는 방법 (0) | 2020.11.22 |