ฉันต้องการเขียนสิ่งนี้
typedef void (*FunctionPtr)();
using
การใช้ ฉันจะทำอย่างไร
ฉันต้องการเขียนสิ่งนี้
typedef void (*FunctionPtr)();
using
การใช้ ฉันจะทำอย่างไร
คำตอบ:
มันมีไวยากรณ์ที่คล้ายกันยกเว้นคุณลบตัวระบุจากตัวชี้:
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>>
ได้
"ความอัปลักษณ์" สามารถนำไปได้หากคุณหลีกเลี่ยงการพิมพ์ตัวชี้:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*
ภายหลังและได้รับข้อผิดพลาดที่ทำให้สับสน
คุณต้องการซึ่งเป็นหลักเหมือนกับการประกาศยกเว้นคุณลบ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] ที่ตัวระบุจะปรากฏขึ้นหากการก่อสร้างเป็น [ประกาศ] ประเภทที่มีชื่อนั้นจะเหมือนกับชนิดของตัวระบุสมมุติฐาน
ไวยากรณ์นี้เกี่ยวกับความชัดเจนอย่างไร (หมายเหตุวงเล็บคู่)
void func();
using FunctionPtr = decltype((func));
วิธีการอื่นอาจใช้ชนิดการคืนอัตโนมัติพร้อมชนิดการคืนกลับมา
using FunctionPtr = auto (*)(int*) -> void;
นี่เป็นข้อได้เปรียบที่พิสูจน์ได้ว่าสามารถบอกบางสิ่งได้ว่าเป็นฟังก์ชั่น ptr เมื่อนามแฝงเริ่มต้นด้วย "auto (*)" และไม่ได้ทำให้งงงวยโดยชื่อตัวระบุ
เปรียบเทียบ
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
กับ
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
คำแถลงการณ์ปฏิเสธความรับผิดชอบ: ฉันนำสิ่งนี้มาจากการพูดคุยของ
using
แน่นอนโดยเฉพาะอย่างยิ่งเพราะตัวระบุชี้ทำงานมักจะอาศัยอยู่ในช่วงกลางของการให้คำสั่งและย้ายไปด้านหน้าใช้typedef
using
อย่างน้อยนั่นคือสิ่งที่ฉันหลงทาง