[英]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<3
和1>()
。
使用括號包裝輸入將起到作用,但為什么會出現這種情況?
因為,
由預處理接受為新的宏參數的分隔符,因為預處理器並不真正關心,你可能有,而不是意味着它作為一個模板參數列表的分隔符。
更准確一點:
ALG( mat.topRightCorner<3,1>() )
^^^^^^^^^^^^^^^^^^^^ ^^^^
這兩個詞匯看起來都像有效的宏參數,宏解析優先。
另一方面,預處理器知道what ()
作用,因此你可以通過這種方式“強制”解析為單個參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.