2012-11-07 25 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 –