typedef 함수 포인터 배열std::function

6978 단어

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로 번잡함을 간략화하여 설명할 때 코드를 크게 간소화할 수 있고 읽기 쉽습니다!


 

좋은 웹페이지 즐겨찾기