C ++用函数替换代码的最佳方法

时间:2014-07-12 04:24:51

标签: c++ function c++11 for-loop

如果我有这样的功能:

void Func(T a)
{
    T b, c, d;
    for (uint i = 0; i < 10000; ++i)
    {
        b = Call1(a);
        c = Call2(b);
        d = Call3(c);
    }
}

我基本上只想让函数看起来像form:

void Func(T a)
{
    T d;
    for (uint i = 0; i < 10000; ++i)
        d = Call(a);
}

其中Call是这样的:

T Call(T a)
{
    T b, c;
    b = Call1(a);
    c = Call2(b);
    d = Call3(c);
    return d;
}

Call每次在循环中调用时都必须重新初始化bc吗?我是否应该在static T b, c

中使用Call function

2 个答案:

答案 0 :(得分:5)

你问:

  

每次在循环中调用时,调用是否必须重新初始化b和c?

答案是肯定的。

你问:

  

我是否应该在Call函数中使用静态T b,c?

答案是,很可能不是。

如果您担心创建T实例的成本,可以使用以下方法优化函数:

T Call(T a)
{
    return Call3(Call2(Call1(a)));
}

答案 1 :(得分:1)

我将向您展示一个更广泛的问题解决方案。 Herb Sutter 在书More Exceptional C++中有一个关于如何模拟嵌套函数的精彩章节:

template <class T> class F {
private:
  //T retval; // if you need Func to return
  //here you can have members that simulate local variables in the original Func
  // T x, y, z;

  // the nested function(s)
  void Call(a) {
    T b, c;
    b = Call1(a);
    c = Call2(b);
    d = Call3(c);
    // ... = x;
    return d;
  }

public:
  int F(T a) { // original function Func, now a consturctor
    T d;
    //x = ...
    for (uint i = 0; i < 10000; ++i)
        d = Call(a);
    // if you need the original function to return:
    // retval = ...;
  }
  // if the original function needs to return:
  T operator()() const {
    return retval;
  }

};