C++ 以循环作为参数的函数

C++ 以循环作为参数的函数,c++,C++,我有以下两个功能体,让A成为一组指令,让B(I,A)成为依赖于A的另一组指令(例如A中定义的变量在B中使用)和I: //do A for(auto i = 0; i < 100; ++i) { //do B(i, A) } 是否有某种方法可以在不损失性能的情况下,在依赖于循环的单个函数中表达这一点?当然,可以用向量来表示函数,但在第一种情况下必须创建向量 根据我的理解,代码重复是A和B(i,A)的重复。如果希望在循环中发送整个循环,可以发送lambda函数的函数指针,如下所示: #i

我有以下两个功能体,让
A
成为一组指令,让
B(I,A)
成为依赖于
A
的另一组指令(例如
A
中定义的变量在
B
中使用)和
I

//do A
for(auto i = 0; i < 100; ++i) {
  //do B(i, A)
}
是否有某种方法可以在不损失性能的情况下,在依赖于循环的单个函数中表达这一点?当然,可以用向量来表示函数,但在第一种情况下必须创建向量


根据我的理解,代码重复是
A
B(i,A)
的重复。如果希望在循环中发送整个循环,可以发送lambda函数的函数指针,如下所示:

#include<functional>
void B(std::function<void()> func)
{
    func();
}

int main(void)
{
    for(auto i = 0; i < 100; ++i) {
        B([&](){for (auto j = 0; j < 100; j++) { } });
    }
    return 0;
}

#包括
void B(标准::函数func)
{
func();
}
内部主(空)
{
用于(自动i=0;i<100;++i){
B([&](){for(autoj=0;j<100;j++){});
}
返回0;
}
你可以做嵌套循环,我想


但是我想我误解了你的问题。

是的,有一个限制,公共函数应该是内联的

可以将循环条件编码为迭代器对,或者理想情况下编码为范围

  • 版本,如果在C++20模式下受支持:

    模板
    空心活套(范围r){
    用于(自动i:r){
    B(i,A);
    }
    }
    
  • 用于生成数字间隔,如

    活套(std::ranges::iota_view{01100});
    
  • 用于仅在整个容器上循环:

    looper(std::views::all(someNumbers));
    
  • 如果您还没有范围支持,请提供更多手动迭代器版本:

    模板
    空心活套(Iter开始,Iter结束){
    用于(自动iter=开始;iter!=结束;++iter){
    B(*国际热核实验堆,A);
    }
    }
    
    整个容器版本很简单,但是生成器需要一些努力。我已经在别处写了一个合适的版本,所以我将把它和一个额外的增强版本链接起来


请提供一份详细的信息。这个问题对我来说并不清楚,它可以帮助我理解你的意思。我不认为我们需要一个MRE来明确如何完成X问题。问题是,一个本身有意义的最小示例将包含大量与问题无关的噪音。你问题的重点似乎集中在循环设置上。你不能删除
//do A
注释并将
//do B(i,A)
更改为
///do stuff
foo(i);//某些功能
?当然,在yoir real设置中,您可能会有更多的参数来
foo
。对于您的示例,我感到困惑的是,要弄清楚
A
应该代表什么,在它出现的两个地方都是有意义的。将
A
抽象出来会使您的示例更精简、更完整、更容易混淆。不,删除
//执行
实际上是不可能的,因为如果您只有一个函数
foo(i)
,那么就不会有代码重复。循环之前的部分与此相关。非常好!我还没有访问c++20,但是boost版本是一个很好的替代品。对不起,我没有注意到这一点。我现在已经修好了。是的,这真是一个匆忙的写作。但现在我又把它修好了。
#include<functional>
void B(std::function<void()> func)
{
    func();
}

int main(void)
{
    for(auto i = 0; i < 100; ++i) {
        B([&](){for (auto j = 0; j < 100; j++) { } });
    }
    return 0;
}