在C ++中,我如何创建一个全新的流控制语句?

时间:2015-07-29 11:16:10

标签: c++ loops statements

我开发了一种算法来将控制标志更改为特定的顺序。可以将其视为计数器或时钟,您可以在其中定义最小值,最大值,步长等。但每次我想使用它时,我都需要复制粘贴几行代码并在中间更改一些行。

如果有一种实现这种新流控制语句的方法,我就会徘徊。我的问题也可以说是“如何编写一个函数,我需要一个简单的或复合的C ++语句作为参数”?

接近我的问题的另一种方法是弄清楚如何转换以下代码:

int a;
vector<int> av;
for(int i = 0; i < 10; i++)
{
    a = (i > a)? i : i*2;
    av.push_back(a);
}
for(int i = 20; i >= 10; i--)
{
    a = ((a+i)%2 == 1)? 0 : i/2;
    av.push_back(a*3);
}

接近这个:

// definition
void another_for_loop(const int &a, const int &b, const int &inc_, [????] )
{
    inc = (inc_ == 0) ? 1 : inc_;
    if(inc > 0)
    {
        for(int i = min(a,b); i <= max(a,b); i += inc)
            [????];
    }
    else
    {
        for(int i = max(a,b); i >= min(a,b); i += inc)
            [????];
    }
}

// [...]
// inside main{}
int a;
vector<int> av;
another_for_loop(0, 9, 1, {a = (i > a)? i : i*2; av.push_back(a);});
another_for_loop(10, 20, -1, {a = ((a+i)%2 == 1)? 0 : i/2; av.push_back(a*3);});

希望有一种聪明的方法...... :-D

即使没有办法,请告诉我。

2 个答案:

答案 0 :(得分:11)

你可以使用functor和lambda:

// definition
template <typename F>
void another_for_loop(const int &a, const int &b, const int &inc_, F f)
{
    int inc = (inc_ == 0) ? 1 : inc_;
    if(inc > 0)
    {
        for(int i = min(a,b); i <= max(a,b); i += inc)
            f(i);
    }
    else
    {
        for(int i = max(a,b); i >= min(a,b); i += inc)
            f(i);
    }
}

然后

int a = 0;
vector<int> av;
another_for_loop(0, 9, 1, [&a, &av](int i){a = (i > a)? i : i*2; av.push_back(a);});
another_for_loop(10, 20, -1, [&a, &av](int i){a = ((a+i)%2 == 1)? 0 : i/2; av.push_back(a*3);});

答案 1 :(得分:1)

解决此类问题的方法称为策略模式,请参阅https://en.wikipedia.org/wiki/Strategy_pattern