c++ - 如何在C++中创建自己的循环版本?

我想知道是否可以为,for_each,而

没有什么我想做的,现有的循环不能这样做,我只是好奇如何工作,如果我需要创建自己的。

例如,如果想要创建另一个仅接受参数的for函数版本。

在本例中,我想为只接受一个参数,一个整数创建一个。 而不是写


for (int i = 0; i < 50; ++i)



我将创建一个这样的版本

 
for_(50)



 

我该怎么做?

时间:

你还可以创建类似于下面所示的函数,但使用标准std::for_each。


#include <iostream>


#include <functional>



template<typename C, typename F>


void for_(C begin_, C end_, F&& f) { // [begin_, end_)


 for (C i = begin_; i < end_; ++i) {


 f(i);


 }


}



template<typename C, typename F>


void for_(C count, F&& f) { // special case for [0, count)


 for_(0, count, f);


}



void mul2(int x) {


 std::cout << x*2 <<"";


}



int main() {


 for_(10, [](int i) { std::cout << i <<"n"; });


 for_(2, 10, mul2);


}



你不能为新循环扩展C++语法。

你可以使用宏,但是这相当丑陋,通常最好避免,获得相似结果的另一种方法是通过传递函子作为参数,这对将Lambda表达式引入C++很有帮助,你可以在<algorithm> header中找到这样的一些示例。

例如:


#include <algorithm>


#include <vector>


int main()


{


 std::vector<int> numbers = { 1, 4, 5, 7, 10 };


 int even_count = 0;


 for (auto x : numbers)


 {


 if (x % 2 == 0)


 {


 ++even_count;


 }


 }


 auto even_count2 = std::count_if(numbers.begin(), numbers.end(), [](int x) { return x % 2 == 0; });


}



一个丑陋和不安全的解决办法是使用宏:


#define REPEAT(i,N) for(int (i) = 0; (i) < (N); ++(i))



int main()


{


 REPEAT(i,10) std::cout << i << std::endl;



 return 0;


}



你可以使用lambda函数,并将function对象作为参数传入,以便在循环的每次迭代中执行。


#include <iostream>


#include <functional>



int main()


{


 auto for_ = [](int start, int size, std::function<void (int i)> fn)


 {


 int end = start + size;



 for (int i = start; i < end; ++i)


 {


 fn(i);


 }


 };



 for_(0, 10, [](int i) { std::cout << i << std::endl; });


 for_(0, 10, [](int i) { std::cout << i*2 << std::endl; });


}



你似乎在重新发明轮子,你可以用std::for_each

...