C ++内联闭包模拟

时间:2014-04-14 14:01:45

标签: c++ closures inline

函数执行两次代码块:对于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)也会伤害表现。

有什么建议吗?

1 个答案:

答案 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] = ...;