簡體   English   中英

宏擴展與模板

[英]macro expansion with templates

我正在編寫幾個函數,它們將模板函數的結果作為輸入:

int alg1(Vect3) {...}
...
int algN(Vect3) {...}

void main() {
    alg1( mat.topRightCorner<3,1>() )
}

其中,如果你很好奇, topRightCorner返回mat的子矩陣,這是一個來自Eigen的方法,其中維度在編譯時已知為模板參數。

然而創建一個“快捷方式”使用宏來快速切換不同的算法(因為在實際代碼中,函數被多次調用),像這樣

#define ALG(X)    ( algN(X) )

ALG( mat.topRightCorner<3,1>() )

給出一個錯誤,因為宏被正確擴展但在某種程度上誤解為有兩個不同的參數, mat.topRightCorner<31>()

使用括號包裝輸入將起到作用,但為什么會出現這種情況?

因為,由預處理接受為新的宏參數的分隔符,因為預處理器並不真正關心,你可能有,而不是意味着它作為一個模板參數列表的分隔符。

更准確一點:

ALG( mat.topRightCorner<3,1>() )
     ^^^^^^^^^^^^^^^^^^^^ ^^^^

這兩個詞匯看起來都像有效的宏參數,宏解析優先。

另一方面,預處理器知道what ()作用,因此你可以通過這種方式“強制”解析為單個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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