[英]Use type of variable declaration inside macro given named declaration
我有一個大型 C++20 代碼庫,其中包含一堆宏實例化,這些宏實例化是這個示例的簡單變體:
void main() {
MAKE_VAR(int myInt);
MAKE_VAR(CMyClass myClass);
MAKE_VAR(CMyClass *pMyClass);
};
因為宏的實用程序是存在於代碼實際編譯之外的過程的一部分,所以#define
目前是微不足道的:
#define MAKE_VAR(var) var
這意味着擴展后的結果代碼很簡單:
void main() {
int myInt;
CMyClass myClass;
CMyClass *pMyClass;
};
但是,我正在嘗試向MAKE_VAR
添加更多智能,這取決於變量的類型,並且出於兼容性原因,我無法更改該宏簽名(例如,讓宏將類型和名稱作為單獨的參數)。
所以,我的問題是是否有一些咒語,我可以使用var
宏參數並只生成該參數的類型,以在隨后生成的代碼中用作模板參數。 請注意,我不需要說出這個名字(我也不相信標准 C++20 可以做到這一點)。
也就是說,我想提出一個宏定義,以便上面的MyStruct
示例擴展為類似這樣的內容(需要任何額外的樣板文件):
void main() {
int myInt;
DoThing<int>();
CMyClass myClass;
DoThing<CMyClass>();
CMyClass *pMyClass;
DoThing<CMyClass *>();
};
我的第一次嘗試圍繞着試圖獲得一些我可以傳遞給decltype
的東西,但我找不到任何允許該名稱存在的咒語。
我已經接近使用以下方法的解決方案,但我有一個不同的問題,它只能工作一次(因為FakeFunc
每個實例沒有唯一的名稱 - 通常我會使用類似於__COUNTER__
或類似的東西,但我需要它在這里跨兩條線工作):
template <typename Sig> struct ArgType;
template <typename Arg> struct ArgType<void(Arg)> { using type = Arg; };
#define MAKE_VAR(var) \
var; \
typedef void FakeFunc( var ); \
DoThing<typename ArgType<FakeFunc>::type>();
void main() {
MAKE_VAR(int myInt);
MAKE_VAR(unsigned myUInt);
};
// Macro expands to:
void main() {
int myInt;
typedef void FakeFunc( int myInt );
DoThing<typename ArgType<FakeFunc>::type>();
unsigned myUInt;
typedef void FakeFunc( unsigned myUInt );
DoThing<typename ArgType<FakeFunc>::type>();
};
關於完成這種方法或使用不同方法的任何想法?
編輯:現在結束問題,因為我需要澄清為什么我不能將FakeFunc
和DoThing
放在本地 scope 中,這是我在這個簡化問題中沒有捕捉到的細微差別......
您無需為 function 命名:
template <typename Sig> struct ArgType;
template <typename Arg> struct ArgType<void(*)(Arg)> { using type = Arg; };
template <typename T> void DoThing() {}
#define MAKE_VAR(var) \
var; \
DoThing<typename ArgType<void (*)( var )>::type>();
int main() {
MAKE_VAR(int x)
MAKE_VAR(unsigned y)
}
宏擴展為
int x; DoThing<typename ArgType<void (*)( int x )>::type>();
unsigned y; DoThing<typename ArgType<void (*)( unsigned y )>::type>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.