在 C++ 中,我将如何创建一个全新的流控制语句?
In C++, how would I create a brand new flow control statement?
我开发了一种算法来将控制标志更改为特定顺序。将它想象成一个计数器或时钟,您可以在其中定义最小值、最大值、步长等。但是每次要用的时候,都需要复制粘贴几行代码,中间改几行。
我在想是否有办法实现这个新的流控制语句。我的问题也可以表述为 "how do I write a function where I require a simple or a compound C++ statement as an argument"?
解决我的问题的另一种方法是找出如何转换以下代码:
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
即使没有办法,也请告诉我。
解决这类问题的方法叫做策略模式见https://en.wikipedia.org/wiki/Strategy_pattern
您可以使用仿函数和 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);});
我开发了一种算法来将控制标志更改为特定顺序。将它想象成一个计数器或时钟,您可以在其中定义最小值、最大值、步长等。但是每次要用的时候,都需要复制粘贴几行代码,中间改几行。
我在想是否有办法实现这个新的流控制语句。我的问题也可以表述为 "how do I write a function where I require a simple or a compound C++ statement as an argument"?
解决我的问题的另一种方法是找出如何转换以下代码:
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
即使没有办法,也请告诉我。
解决这类问题的方法叫做策略模式见https://en.wikipedia.org/wiki/Strategy_pattern
您可以使用仿函数和 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);});