답변:
포인터에서 식별자를 제거한다는 점을 제외하면 비슷한 구문이 있습니다.
using FunctionPtr = void (*)();
여기에 예가 있습니다
"추악함을 없애고 싶다면"Xeo가 제안한 것을 시도해보십시오.
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
그리고 여기 또 다른 데모가 있습니다.
:(
using FunctionPtr = AddPointer<void()>;
;)
add_pointer<void()>::type
. 제안 사항 사용 : groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/… 쓸 수 있습니다 pointer<function<void>>
.
포인터를 typedef하지 않는 경우 "추악함"을 제거 할 수도 있습니다.
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*
나중에 잊어 버리고 혼란스러워하는 오류가 발생할 수 있습니다.
type-id
를 삭제한다는 점을 제외하면 선언과 정확히 동일한를 원합니다 declarator-id
. 은 declarator-id
일반적으로 식별자이며, 이름은 당신이 equivilant 선언에 선언되어있다.
예를 들면 다음과 같습니다.
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]의 위치를 고유하게 식별 할 수 있습니다. 명명 된 형식은 가상 식별자의 형식과 동일합니다.
명확성을 위해이 구문은 어떻습니까? (중괄호 참고)
void func();
using FunctionPtr = decltype((func));
다른 접근 방식은 후행 리턴 유형과 함께 자동 리턴 유형을 사용할 수 있습니다.
using FunctionPtr = auto (*)(int*) -> void;
이것은 별명이 "auto (*)"로 시작하고 식별자 이름에 의해 난독 화되지 않을 때 무언가를 함수 ptr이라고 말할 수 있다는 논쟁의 여지가 있습니다.
비교
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
와
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
면책 조항 : 나는 Bean Deane의 "Easing into Modern C ++"에서 이것을 취했습니다.
using
특히 함수 포인터 식별자는 일반적으로typedef
명령문 중간에 상주하고를 사용하여 맨 앞으로 이동하기 때문에 매우 혼동 됩니다using
. 적어도 내가 잃어버린 곳입니다.