ค้นหาประเภทของ __VA_ARGS__ ในแมโครแปรผัน

สมมุติว่าฉันมีมาโครแปรผัน (เช่น MY_MACRO(...)) และฉันเรียกมันว่าด้วยวิธีต่อไปนี้:

MY_MACRO(std::pair<int, int> const &p)

ตอนนี้ __VA_ARGS__ ในตัวมาโครของฉันจะเป็น std::pair<int, int> const &p

มีวิธีหาประเภทของ __VA_ARGS__ หรือไม่?

สมมุติว่าฉันจะขอบคุณถ้าบางอย่างเช่น decltype(std::pair<int, int> const &p) ทำงานและให้ผลตอบแทน std::pair<int, int> const& ดังนั้นในตัวแมโครแปรผันของฉัน decltype(__VA_ARGS__) ก็จะให้ผล std::pair<int, int> const& เช่นกัน น่าเสียดายที่สิ่งนี้ใช้ไม่ได้


person 101010    schedule 03.10.2018    source แหล่งที่มา
comment
Preprocessor-macro เป็นสิ่งที่ C ++ เช่นเดียวกับทุกสิ่งที่สืบทอดและ / หรือนำมาใช้จาก C   -  person Deduplicator    schedule 04.10.2018
comment
@Deduplicator ฝังขวาน   -  person 101010    schedule 04.10.2018
comment
อาร์กิวเมนต์ของมาโครเป็นสตริงที่กำหนดเอง ซึ่งไม่จำเป็นต้องแยกวิเคราะห์ ดังนั้นการพูดถึงประเภทของข้อโต้แย้งจึงไม่ค่อยสมเหตุสมผล   -  person Yves Daoust    schedule 04.10.2018
comment
@YvesDaoust ฉันรู้ แต่ฉันหวังว่าจะมีแหล่งที่มาที่ชั่วร้ายบางอย่าง ...   -  person 101010    schedule 04.10.2018
comment
@ShafikYaghmour: มันเป็นรายการข้อโต้แย้งสองข้อ แต่สามารถใช้งานได้กับ __VA_ARGS__   -  person MSalters    schedule 04.10.2018


คำตอบ (1)


คุณสามารถใช้ __VA_ARGS__ เป็นพารามิเตอร์ lambda จากนั้นแปลง lambda นั้นเป็นตัวชี้ฟังก์ชันและแยกประเภทพารามิเตอร์:

template <typename T> struct func_param {};
template <typename T> struct func_param<void(*)(T)> {using type = T;};

#define FOO(...) \
    do \
    { \
        auto lambda = +[]([[maybe_unused]] __VA_ARGS__) {}; \
        using type = func_param<decltype(lambda)>::type; \
        /* Do something with `type`. */\
    } \
    while (0);
person HolyBlackCat    schedule 03.10.2018
comment
ใช่ และเคล็ดลับในการใช้ unary + กับ lambda ดังกล่าวจะบังคับให้เกิดการแปลง เนื่องจากไม่มีการโอเวอร์โหลด operator+ ที่ตรงกับประเภท lambda แต่ตัวชี้ไปยังฟังก์ชันคือตัวถูกดำเนินการที่ถูกต้องของความหมายในตัวของ unary + - person aschepler; 04.10.2018