Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;,我如何创建一个全新的流量控制语句?_C++_Loops_Statements - Fatal编程技术网

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

C++ 在C++;,我如何创建一个全新的流量控制语句?,c++,loops,statements,C++,Loops,Statements,我开发了一种算法,可以将控制标志更改为特定的顺序。可以把它想象成一个计数器或时钟,在这里可以定义最小值、最大值、步长等等。但每次我想使用它,我需要复制粘贴几行代码,并改变中间的一些线。 我想知道是否有一种方法可以实现这个新的流控制语句。我的问题也可以说是“我如何写一个函数,我需要一个简单的或复合的C++语句作为一个参数”? 解决我的问题的另一种方法是找出如何转换以下代码: int a; vector<int> av; for(int i = 0; i < 10; i++) {

我开发了一种算法,可以将控制标志更改为特定的顺序。可以把它想象成一个计数器或时钟,在这里可以定义最小值、最大值、步长等等。但每次我想使用它,我需要复制粘贴几行代码,并改变中间的一些线。 我想知道是否有一种方法可以实现这个新的流控制语句。我的问题也可以说是“我如何写一个函数,我需要一个简单的或复合的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);
}
inta;
向量av;
对于(int i=0;i<10;i++)
{
a=(i>a)?i:i*2;
av.推回(a);
}
对于(int i=20;i>=10;i--)
{
a=((a+i)%2==1)?0:i/2;
平均推回(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);});
//定义
另一个循环无效(常量int&a、常量int&b、常量int&inc)[??????])
{
inc=(inc=0)?1:inc;
如果(inc>0)
{
对于(int i=min(a,b);i=min(a,b);i+=inc)
[????];
}
}
// [...]
//内主{}
INTA;
向量av;
另一个循环(0,9,1,{a=(i>a)?i:i*2;av.push_back(a);});
另一个循环(10,20,-1,{a=((a+i)%2==1)?0:i/2;av.push_-back(a*3);};
希望有一个聪明的方法来做到这一点…:-D


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

解决这类问题的方法称为策略模式参见

您可以使用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、常量int&b、常量int&inc、F)取消另一个循环(常量int&a、常量int&b、常量int&inc、F)
{
int inc=(inc_==0)?1:inc;
如果(inc>0)
{
对于(int i=min(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);});
inta=0;
向量av;
另一个循环(0,9,1,[&a,&av](inti){a=(i>a)?i:i*2;av.push_back(a);});
另一个循环(10,20,-1,[&a,&av](inti){a=((a+i)%2==1)?0:i/2;av.push_-back(a*3);};

你可能想阅读,看看标准库是如何处理这些东西的(例如,函数)。<代码>(int i=(INC>0)min(a,b):max(a,b);(Inc. 0))(i= min(a,b);i++int)< /> >不幸的是C++不是LISP,所以没有宏,你需要求助于“工作的环绕”,答案是提供给你的。strategy模式使用主类中继承的接口类来定义行为,可能是在构造函数中传递的。这只是将回调传递给泛型函数。好的,类的行为不会改变,但是使用相同的方法(如在策略模式中),您可以完成相同的操作。这种方法适用于任何面向对象的编程语言,而不仅仅是一种具有lambda、函数指针、回调或委托等优良特性的语言。你可以参考我之前的一个答案:,它通过接口显示回调。尽管它与strategy模式类似,但它并不相同,因为它有另一个用途,特别是当回调作为函数的参数传递时。但既然我说的是目的,而你们说的是方法,这不是一个明智的讨论。谢谢你们的见解,但我试图找到更像循环语句的东西。Jarod42和MSalters解释的方法允许我在我的personal functions集合头中将其实现为
inline
,并与我需要的任何代码一起使用,类似于常规循环语句。我将
a,b,inc
作为常规
int
传递。这不仅提高了自身的效率,还避免了对
inc
本地可修改副本的需要。另一方面,复制一些未知的
F
可能非常昂贵。哇!这正是我希望帮助我摆脱困境的原因!我已经根据我的算法对它进行了调整,它工作得完美无缺!:-D是否还有一种方法可以将
(int i)
包含在
类型名F
中?我的意思是,这个论点永远不会改变…@iperetta:你可以用
std::function
代替F@Jarod:对不起,我最后的评论很糟糕。我试图知道是否有办法避免调用方使用
(inti)
,如
另一个\u for_循环(0,9,1,[&a,&av]{a=(I>a)?I:I*2;av.push_back(a);}。参数总是相同的(在这个简单的例子中,
inti
)。正如您所说,我试图使用
std::function
来完成此任务,但我不断收到
错误:无法将“main(int,char**):::u lambda0{(*&a),(*&av)}”从“main(int,char**)::u lambda0”转换为“std::function”
…还有其他想法吗?我是否应该放弃并继续使用另一个循环(0,9,1,[&a,&av]**(inti)**{a=(I>a)?I:I*2;av.push_back(a);}