typedef 함수 포인터 배열std::function
1. 정수 포인터
typedef int* PINT;또는 typedef int *PINT
2. 구조체
typedef struct { double data;}DATA, *PDATA;//DATA는 구조체 유형 별칭, PDATA는 구조체 포인터 유형 별칭
3. 함수 포인터
#include<iostream>
using namespace std;
void say()
{
cout << "hello world" << endl;
}
int main()
{
void (*p)() = &say; //
(*p)();// p();
return 0;
}
함수 이름은 유사한 그룹 이름입니다. int a[100];그룹 변수 a를 정의했습니다. a는 int[100] 형식이고 그룹 형식입니다.하지만 int*p = a;변수 a를 int*형 변수 p에 직접 부여할 수 있지만 두 가지 유형은 다르다.이것은 은밀한 변환을 포함하기 때문입니다. a는 그룹 주소를 가리키는 바늘 상수, 즉 int* const 형식으로 변환됩니다.은식 변환이 없는 문법은 다음과 같아야 한다. int*p=&a[0];
함수voidsay();함수say를 설명합니다.say는void(void) 형식이고 함수 형식입니다.상례의 함수 바늘 p는 p=&say 또는 p=say로 값을 부여할 수 있습니다.p=say일 때,say는 함수 주소를 가리키는 함수 포인터 상수, 즉 void say (* const) () 형식으로 은밀하게 변환됩니다.호출할 때도 역변환을 할 수 있기 때문에 p();또는 (*p)();함수를 호출할 수 있습니다!
typedf 성명 함수 포인터 형식 사용 가능
typedef void (*)() S; //error,
typedef void (*S)(); //ok!
예:
#include<iostream>
using namespace std;
void say1()
{
cout << "say1" << endl;
}
void say2()
{
cout << "say2" << endl;
}
int main()
{
typedef void (*SAY)(); //
SAY s;
s = say1;
s(); // (*s)();
(s = say2)(); //
return 0;
}
여기는main 함수에 명시된 국부 형식입니다.물론 전역 또는 클래스 역할 영역에도 놓을 수 있다
C++11: std::function을 사용할 수도 있습니다.클래스 템플릿 std::function은 통용되고 다태적인 함수 봉인입니다.std::function의 실례는 호출할 수 있는 모든 목표를 저장, 복사, 호출할 수 있습니다. 이 목표는 함수, lambda 표현식, 귀속 표현식, 그리고 기타 함수 대상 등을 포함합니다.필수 #include
//
#include <functional>
int main()
{
std::function<void ()> sf;
sf = &say1;
sf();
sf = &say2;// sf = say2
sf();
return 0;
}
4. 함수 포인터 배열
먼저 []의 우선순위가 높은 것과 ().-> 이 세 가지는 모두 최고 우선 순위
void ((*p)[2])();// :'p'
void (*p[2])() = {say1, say2}; //ok;
p[0]();
(*p[1])();
위에서 p는 하나의 수조로 두 개의 원소를 포함하고 원소 유형은 함수 바늘void(*)()이다.
//
typedef void (*S[2])();
cout << sizeof(S) << endl;//8
S a = {say1, say2};
// ,
typedef void (*S)();
S a[2] = {say1, say2};
4, 반환 값, 형 참조 함수 포인터
int (*S)(int i, void (*p)());//함수 포인터 S를 설명하고 함수를 가리킵니다.이 함수 반환 값 형식은 int입니다. 두 가지 인자가 있습니다. int 변수 i와 함수 포인터 p입니다.
int* (*r)() (*S[2])(void (*p1)(), int& (*p2[3])(int*, int*));//성명 일수조.하지만 vs 2013 컴파일 오류
위쪽은 너무 복잡해서 컴파일러가 정상적으로 처리할 수 없고, 더 복잡한 성명을 작성할 수도 있다.typedef를 사용하여 선언을 단순화할 수 있습니다.
typedef int* (*RTN)();// :
typedef void (*P1)();// 1:
typedef int& (*P2)(int*, int*);
typedef RTN (*S)(P1, P2[3]);
S a[2];//
5. 구성원 함수 포인터
class Base {public: int m a;void foo () {} static void sfoo () {}//주의: static는 함수를 수식하는 것이지 되돌아오는 값이 아닙니다}
int (Base::*pa) = &Base::m_a;void (Base::*f1)() = &Base::foo;//참고:::뒤에 void(*f2)() = & Base::sfoo();//static 구성원의 바늘은 작용역 std::function<>을 지정할 필요가 없음을 주의하십시오
#include <iostream>
using namespace std;
class AA
{
public:
int m_a = 4;
void f1()
{
cout << "AA::f1()" << endl;
}
void f2()
{
cout << "AA::f2()" << endl;
}
};
void main(void)
{
AA aa;
int (AA::*pa) = &AA::m_a;
cout << aa.*pa << endl;//4
void (AA::*f)() = NULL;
f = &AA::f1;
(aa.*f)();//AA::f1()
f = &AA::f2;
(aa.*f)();//AA::f2()
}
std::function은 std::bind---VS2013에 계속 컴파일 오류 발생,sigh~
#include <functional>
class T
{
public:
void foo(int a){cout << "a: " << a << endl;}
};
int main()
{
T t;
// 1
std::function<void (int)> sf = std::bind(&T::foo, &t, 5);
sf();
// 2:
std::function<void (const &, int)> sf2 = std::bind(&T::foo);
sf2(t, 5);
return 0;
}
typedef로 번잡함을 간략화하여 설명할 때 코드를 크게 간소화할 수 있고 읽기 쉽습니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.