簡體   English   中英

C ++宏和重載

[英]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()

在這種情況下,我從FIRSTSECOND缺少了分號。 我試圖弄清楚,可以對FIRST宏進行哪些更改(可能),以便可以在兩種情況下進行編譯。 我不確定我是否能夠正確地解釋自己。 有任何想法嗎?

您的問題很奇怪。 我強烈建議您不要在實際代碼中使用這種怪異的構造。 但是我看着你的問題好像是一個有趣的難題。

潛在解決方案

我認為沒有辦法通過僅更改First來使兩個語句都編譯。 但是,如果將Second更改為:

#define Second +0,a() / b()

它在兩種情況下都可以編譯,唯一的條件是結合intObjct定義了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM