Câu trả lời:
Nó có một cú pháp tương tự, ngoại trừ bạn loại bỏ định danh khỏi con trỏ:
using FunctionPtr = void (*)();
Đây là một ví dụ
Nếu bạn muốn "lấy đi sự xấu xí", hãy thử những gì Xeo gợi ý:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
Và đây là một bản demo khác .
:(
using FunctionPtr = AddPointer<void()>;
;)
add_pointer<void()>::type
: Sử dụng đề xuất tại đây: Groups.google.com/a/isocpp.org/d/msg/std-proposeals/xDQR3y5uTZ0/, bạn có thể viết pointer<function<void>>
.
"Sự xấu xí" cũng có thể bị lấy đi nếu bạn tránh gõ con trỏ:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*
sau này và nhận được các lỗi khó hiểu.
Bạn muốn một type-id
, về cơ bản giống hệt như một tuyên bố ngoại trừ bạn xóa declarator-id
. Các declarator-id
thường là một định danh, và tên bạn đang khai báo trong tờ khai equivilant.
Ví dụ:
int x
Các declarator-id
được x
vì vậy chỉ cần loại bỏ nó:
int
Tương tự như vậy:
int x[10]
Xóa x
:
int[10]
Ví dụ của bạn:
void (*FunctionPtr)()
Ở đây declarator-id
là FunctionPtr
. Vì vậy, chỉ cần loại bỏ nó để có được type-id
:
void (*)()
Điều này hoạt động vì được cung cấp, type-id
bạn luôn có thể xác định duy nhất nơi định danh sẽ đi để tạo khai báo. Từ 8.1.1 trong tiêu chuẩn:
Có thể xác định duy nhất vị trí trong [loại id] nơi định danh sẽ xuất hiện nếu công trình là [khai báo]. Loại được đặt tên sau đó giống như loại định danh giả định.
Làm thế nào về cú pháp này cho rõ ràng? (Lưu ý dấu ngoặc kép)
void func();
using FunctionPtr = decltype((func));
Một cách tiếp cận khác có thể sử dụng kiểu trả về tự động với kiểu trả về theo sau.
using FunctionPtr = auto (*)(int*) -> void;
Điều này có lợi thế có thể tranh cãi là có thể nói một cái gì đó là một hàm ptr khi bí danh bắt đầu bằng "auto (*)" và nó không bị xáo trộn bởi các tên định danh.
Đối chiếu
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
với
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Tuyên bố miễn trừ trách nhiệm: Tôi đã lấy điều này từ bài nói chuyện "Dễ dàng vào C ++ hiện đại" của Bean Deane
using
thực sự rất khó hiểu , đặc biệt là vì các định danh con trỏ hàm thường nằm ở giữatypedef
câu lệnh và di chuyển ra phía trước bằng cách sử dụngusing
. Ít nhất đó là nơi tôi đã mất.