sangat conf usingmemang, terutama karena pengidentifikasi fungsi pointer biasanya berada di tengah typedefpernyataan dan pindah ke depan menggunakan using. Setidaknya di situlah aku tersesat.
starturtle
Jawaban:
180
Ini memiliki sintaks yang sama, kecuali Anda menghapus pengidentifikasi dari pointer:
Alias tipe ini mengubah sintaksis tipe dari sintaksis tidak jelas, dalam-ke luar menjadi sintaksis kiri-ke-kanan yang sederhana, yang sebagian besar menghilangkan kebutuhan akan typedef khusus untuk API tertentu yang membuatnya lebih mudah untuk menulis tipe majemuk API itu.
bames53
10
Di C ++ 14, Anda akan dapat menulis: menggunakan FunctionPtr = std :: add_pointer_t <void ()>;
Andrzej
46
"Keburukan" juga dapat dihapus jika Anda menghindari mengetikkan pointer:
Ini adalah pendekatan yang menarik, meskipun saya mungkin khawatir saya akan melupakannya *nanti dan mendapatkan kesalahan yang membingungkan.
Apollys mendukung Monica
Ini jelas merupakan versi terbaik yang disajikan di sini. Terima kasih. Dan saya lebih suka melihat pointer, karena itu adalah pointer fungsi.
Pierre
13
Anda menginginkan type-id, yang pada dasarnya sama persis dengan deklarasi kecuali Anda menghapus declarator-id. The declarator-idbiasanya merupakan identifier, dan nama Anda menyatakan dalam deklarasi equivilant.
Sebagai contoh:
int x
The declarator-idadalah xjadi hanya menghapusnya:
int
Juga:
int x[10]
Hapus x:
int[10]
Sebagai contoh Anda:
void(*FunctionPtr)()
Di sini declarator-idadalah FunctionPtr. jadi hapus saja untuk mendapatkan type-id:
void(*)()
Ini berfungsi karena diberikan type-idAnda 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.
Apa arti tanda kurung ganda dalam konteks ini? Sebuah referensi untuk fungsi pointer?
0x499602D2
5
Anda FunctionPtrbukan penunjuk fungsi, tetapi decltype(&f), lihat di sini .
rubenvb
@ 1234597890 FunctionPtr adalah referensi nilai non-const untuk mengetikkan 'void ()'
Leo Goodstadt
@rubenvb: Anda benar. Ini bukan penunjuk fungsi tetapi referensi nilai untuk fungsi (tipe). Karena itulah static_assert gagal ... <br/> Coba gunakan FunctionPtr: using namespace std; #include <iostream> void do_f () {cerr << "what? \ n"; } membatalkan f (); menggunakan FunctionPtr = decltype ((f)); menggunakan FunctionPtr2 = decltype (& f); // Tidak berfungsi // menggunakan FunctionPtr3 = decltype (f); int main () {FunctionPtr ff = do_f; ff (); FunctionPtr2 ff2 = do_f; ff2 (); }
Leo Goodstadt
1
Pendekatan lain mungkin menggunakan tipe pengembalian otomatis dengan tipe penelusuran belakang.
usingFunctionPtr=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.
using
memang, terutama karena pengidentifikasi fungsi pointer biasanya berada di tengahtypedef
pernyataan dan pindah ke depan menggunakanusing
. Setidaknya di situlah aku tersesat.Jawaban:
Ini memiliki sintaks yang sama, kecuali Anda menghapus pengidentifikasi dari pointer:
Ini sebuah contoh
Jika Anda ingin "menghilangkan keburukan", coba apa yang disarankan Xeo:
Dan ini demo lain .
sumber
:(
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 menulispointer<function<void>>
."Keburukan" juga dapat dihapus jika Anda menghindari mengetikkan pointer:
http://ideone.com/e1XuYc
sumber
*
nanti dan mendapatkan kesalahan yang membingungkan.Anda menginginkan
type-id
, yang pada dasarnya sama persis dengan deklarasi kecuali Anda menghapusdeclarator-id
. Thedeclarator-id
biasanya merupakan identifier, dan nama Anda menyatakan dalam deklarasi equivilant.Sebagai contoh:
The
declarator-id
adalahx
jadi hanya menghapusnya:Juga:
Hapus
x
:Sebagai contoh Anda:
Di sini
declarator-id
adalahFunctionPtr
. jadi hapus saja untuk mendapatkantype-id
: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:sumber
Bagaimana dengan sintaks ini untuk kejelasan? (Catatan kurung ganda)
sumber
FunctionPtr
bukan penunjuk fungsi, tetapidecltype(&f)
, lihat di sini .Pendekatan lain mungkin menggunakan tipe pengembalian otomatis dengan tipe penelusuran belakang.
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
dengan
Penafian: Saya mengambil ini dari pembicaraan "Easing into Modern C ++" Bean Deane
sumber