Temukan jenis __VA_ARGS__ dalam makro variadik

Seharusnya, saya memiliki makro variadik (mis., MY_MACRO(...)) dan saya menyebutnya dengan cara berikut:

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

Sekarang, __VA_ARGS__ di badan makro saya akan menjadi std::pair<int, int> const &p.

Apakah ada cara untuk mengetahui tipe __VA_ARGS__?

Agaknya, saya akan bersyukur jika sesuatu seperti decltype(std::pair<int, int> const &p) berfungsi dan menghasilkan std::pair<int, int> const&, jadi di badan makro variadik saya decltype(__VA_ARGS__) akan menghasilkan std::pair<int, int> const& juga. Sayangnya ini tidak berhasil.


person 101010    schedule 03.10.2018    source sumber
comment
Makro-praprosesor adalah hal-hal C++, seperti segala sesuatu yang diwarisi dan/atau diadopsi dari C.   -  person Deduplicator    schedule 04.10.2018
comment
@Deduplicator mengubur kapaknya.   -  person 101010    schedule 04.10.2018
comment
Argumen makro adalah string arbitrer yang tidak perlu diuraikan. Jadi membicarakan jenis argumennya tidak masuk akal.   -  person Yves Daoust    schedule 04.10.2018
comment
@YvesDaoust Saya tahu, tapi saya mengharapkan sumber yang jahat...   -  person 101010    schedule 04.10.2018
comment
Apakah koma benar-benar berfungsi dalam kasus Anda?   -  person Shafik Yaghmour    schedule 04.10.2018
comment
@ShafikYaghmour: Ini adalah daftar dua argumen, tetapi dapat digunakan dengan __VA_ARGS__   -  person MSalters    schedule 04.10.2018


Jawaban (1)


Anda dapat menggunakan __VA_ARGS__ sebagai parameter lambda, lalu mengonversi lambda tersebut menjadi penunjuk fungsi dan mengekstrak jenis parameter:

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
Catatan menggunakan fakta bahwa lambda tanpa penangkapan dapat dikonversi ke penunjuk fungsi - person Shafik Yaghmour; 04.10.2018
comment
Ya, dan juga trik yang menerapkan unary + ke lambda seperti itu memaksa konversi, karena tidak ada operator+ yang kelebihan beban yang cocok dengan tipe lambda, tetapi penunjuk ke fungsi adalah operan yang valid dari makna bawaan unary +. - person aschepler; 04.10.2018