2012-11-07 32 views
3

我正在寫幾個函數需要輸入一個模板函數的結果宏展開:使用模板

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>()

使用方括號包裝輸入將做到這一點,但爲什麼這種行爲?

+0

@WhozCraig:'(因爲在真正的代碼中函數被調用很多次)' –

回答

4

由於,被預處理程序接受爲新宏參數的分隔符,並且由於預處理程序並不真正關心您是否可能將其指定爲模板參數列表的分隔符。

稍微更精確:

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

的這些詞彙都看起來像合法宏參數和宏解析優先。

另一方面,預處理器知道()做什麼,所以你可以「強制」解析爲一個單一的參數。

+0

**另請參見:** http://stackoverflow.com/a/10208278/560648 –