본문 바로가기
개발/C++

구문을 사용하여 C++11에서 함수 포인터를 어떻게 typedef합니까?

by MinorMan 2022. 10. 14.
반응형

<질문>

나는 이것을 쓰고 싶다

typedef void (*FunctionPtr)();

사용using. 어떻게 해야 할까요?


<답변1>

포인터에서 식별자를 제거하는 것을 제외하고는 유사한 구문을 가지고 있습니다.

using FunctionPtr = void (*)();

여기Example

"추함을 제거"하려면 Xeo가 제안한 것을 시도하십시오.

#include 

using FunctionPtr = std::add_pointer::type;

그리고 여기 또 다른demo.


<답변2>

포인터 형식 정의를 피하면 "추함"도 제거할 수 있습니다.

void f() {}
using Function_t = void();    
Function_t* ptr = f;
ptr();

http://ideone.com/e1XuYc


<답변3>

당신은 원하는type-id, 삭제하는 것을 제외하고는 선언과 본질적으로 정확히 동일합니다.declarator-id. 그만큼declarator-id 일반적으로 식별자이며 등가 선언에서 선언하는 이름입니다.

예를 들어:

int x

그만큼declarator-id ~이다x 그래서 그냥 제거:

int

비슷하게:

int x[10]

제거x:

int[10]

귀하의 예:

void (*FunctionPtr)()

여기declarator-id ~이다FunctionPtr. 그래서 그것을 얻기 위해 그것을 제거하십시오type-id:

void (*)()

이것은 주어진 때문에 작동합니다type-id 선언을 생성하기 위해 식별자가 어디로 갈 것인지 항상 고유하게 결정할 수 있습니다. 표준의 8.1.1부터:

식별자가 나타날 [type-id]의 위치를 고유하게 식별하는 것이 가능합니다. 건설이 [선언]이라면. 명명 된 유형은 다음 유형과 동일합니다. 가상 식별자.


<답변4>

명확성을 위해 이 구문은 어떻습니까? (중괄호 참고)

void func();
using FunctionPtr = decltype((func));

<답변5>

다른 접근 방식은 후행 반환 유형과 함께 자동 반환 유형을 사용할 수 있습니다.

using FunctionPtr = auto (*)(int*) -> void;

이것은 별칭이 "auto(*)"로 시작하고 식별자 이름으로 난독화되지 않을 때 무언가가 함수 ptr이라고 말할 수 있다는 논쟁의 여지가 있는 이점이 있습니다.

비교하다

typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3);

~와 함께

using FunctionPtr = auto (*)(type1*, type2**, type3) -> someStructureWithAWeirdName&;

면책 조항: 나는 이것을 Bean Deane의 "Easing into Modern C++" 강연에서 가져왔습니다.

728x90

댓글