函数执行两次代码块:对于cnt = 0和cnt = 1.目前我使用以下实现:
int func {
int V1, V2, ... , Vn;
#define cnt 0
// a block of code: some operations with V1, ... , Vn
#undef cnt
#define cnt 1
// the same block of code
#undef cnt
}
这段代码非常难看。使用内联函数会导致更加丑陋的代码:我需要通过引用将所有涉及的变量传递给函数。因此,我想创造某种封闭。
我不能使用像
这样的东西struct Nested {
__forceinline void block(const int cnt) {
// block of code
};
};
因为出于性能原因,V1,...,Vn不应该是静态的。
我尝试使用lambda函数但Visual C ++ 2013无法内联它,即使内联设置为" Any Suitable(/ Ob2)" (即使是PGO)也会伤害表现。
有什么建议吗?
答案 0 :(得分:5)
你可以这样做:
struct func_impl
{
int V1, V2, ..., Vn;
int res;
template <int cnt>
void blockOfCode() {
...
}
};
int func()
{
func_impl f;
f.blockOfCode<0>();
f.blockOfCode<1>();
return f;
}
这应该等同于您的#define
解决方案。
编辑在评论中,您提到您还有var ## cnt
等变量。这些可以用两元素数组替换,使用模板参数cnt
来索引它们:
int var[2];
var[cnt] = ...;