[英]C++ Macros and overloading
我正在使用c ++宏,試圖以某些模式實現。 我有以下3個宏:
#define First Objct t; t
#define Second a() / b()
#define Third ;
我以以下格式過載了lambda-ops: Objct [ Objct ]
所以當我在main()中有一行像:
First [ Second ] Third
它工作正常,因為它已“翻譯”為:
Objct t; t[a()/b()]
(注意: a()
和b()
是返回類型對象的偽函數。)
困難的是,我還必須使它在沒有lambda的情況下工作。
First Second Third
意思是
Objct t; t a() / b()
在這種情況下,我從FIRST
到SECOND
缺少了分號。 我試圖弄清楚,可以對FIRST
宏進行哪些更改(可能),以便可以在兩種情況下進行編譯。 我不確定我是否能夠正確地解釋自己。 有任何想法嗎?
您的問題很奇怪。 我強烈建議您不要在實際代碼中使用這種怪異的構造。 但是我看着你的問題好像是一個有趣的難題。
潛在解決方案
我認為沒有辦法通過僅更改First
來使兩個語句都編譯。 但是,如果將Second
更改為:
#define Second +0,a() / b()
它在兩種情況下都可以編譯,唯一的條件是結合int
為Objct
定義了operator +
。 如果您設法實現該運算符而沒有副作用,那么它甚至會產生您期望的結果。
為什么行得通?
該定義使用了逗號運算符,唯一的問題是逗號運算符需要兩個表達式。 +0從句法上解決了這個問題,因為僅+0
有效,而t+0
在上述要求下有效。
有了這樣的定義, First Second Third
被預處理為
Objct t; t +0,a() / b() ; // comma operator evaluates t+0
// then a()/b()
First [Second] Third
將被預處理為
Objct t; t [+0,a() / b()] ; // comma operator makes +0 being evaluated
// and lost and [] is called with value of a()/b().
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.