Jawaban:
Ini memiliki sintaks yang sama, kecuali Anda menghapus pengidentifikasi dari pointer:
using FunctionPtr = void (*)();
Ini sebuah contoh
Jika Anda ingin "menghilangkan keburukan", coba apa yang disarankan Xeo:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
Dan ini demo lain .
:(
using FunctionPtr = AddPointer<void()>;
)
add_pointer<void()>::type
: Menggunakan saran di sini: groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/… Anda dapat menulis pointer<function<void>>
.
"Keburukan" juga dapat dihapus jika Anda menghindari mengetikkan pointer:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*
nanti dan mendapatkan kesalahan yang membingungkan.
Anda menginginkan type-id
, yang pada dasarnya sama persis dengan deklarasi kecuali Anda menghapus declarator-id
. The declarator-id
biasanya merupakan identifier, dan nama Anda menyatakan dalam deklarasi equivilant.
Sebagai contoh:
int x
The declarator-id
adalah x
jadi hanya menghapusnya:
int
Juga:
int x[10]
Hapus x
:
int[10]
Sebagai contoh Anda:
void (*FunctionPtr)()
Di sini declarator-id
adalah FunctionPtr
. jadi hapus saja untuk mendapatkan type-id
:
void (*)()
Ini berfungsi karena diberikan type-id
Anda selalu dapat menentukan secara unik ke mana pengenal akan pergi untuk membuat deklarasi. Dari 8.1.1 dalam standar:
Dimungkinkan untuk mengidentifikasi secara unik lokasi di [type-id] tempat pengidentifikasi akan muncul jika konstruksi adalah [deklarasi]. Jenis yang dinamai ini kemudian sama dengan jenis pengenal hipotetis.
Bagaimana dengan sintaks ini untuk kejelasan? (Catatan kurung ganda)
void func();
using FunctionPtr = decltype((func));
Pendekatan lain mungkin menggunakan tipe pengembalian otomatis dengan tipe penelusuran belakang.
using FunctionPtr = auto (*)(int*) -> void;
Ini memiliki keunggulan yang dapat diperdebatkan untuk dapat mengatakan sesuatu adalah fungsi ptr ketika alias dimulai dengan "auto (*)" dan tidak dikaburkan oleh nama pengenal.
Membandingkan
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
dengan
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
Penafian: Saya mengambil ini dari pembicaraan "Easing into Modern C ++" Bean Deane
using
memang, terutama karena pengidentifikasi fungsi pointer biasanya berada di tengahtypedef
pernyataan dan pindah ke depan menggunakanusing
. Setidaknya di situlah aku tersesat.