C++ 实现foreach 效果 以及循环调用函数

#ifndef __FOREACH_H__
#define __FOREACH_H__
#define in ,
#define ITERATOR(j,S) for(auto j = S.begin(); j != S.end(); ++j)

#ifdef WIN32

#define LL (
#define foreach(...)  ITERATOR LL __VA_ARGS__ )

#else

#define foreach(...)  ITERATOR(__VA_ARGS__)

#endif


template <typename T, typename F, typename... Args>
void LoopCall(T & t, F f, Args&&... args)
{
	foreach(elem in t)
	{
		using ValueType = typename std::iterator_traits<decltype(elem)>::value_type;
		if constexpr (std::is_pointer_v<ValueType>)
		{
			((*elem)->*f)(std::forward<Args>(args)...);
		}
		else
		{
			((*elem).*f)(std::forward<Args>(args)...);
		}
	}
}

#endif

测试代码如下


#include <iostream>
#include <vector>
#include <list>
#include "foreach.h"
class Data
{
public:
	Data(int _age):age(_age) {};
	~Data() {
		std::cout << "release data"  << std::endl;
	};
	void OnPrint() {
		std::cout << " age is :" << this->age << std::endl;
	}
	void DelPtr()
	{
		 delete this;
	}
	void OnPrintCounts(int counts)
	{
		std::cout << " age is :" << this->age<<"counts:"<<counts << std::endl;
	}
private:
	int age;
};


int main()
{
	{
		std::list<Data> d = { Data(10), Data(20), Data(30), Data(50), Data(10),
		};
		LoopCall(d, &Data::OnPrint);
		LoopCall(d, &Data::OnPrintCounts,10);
		foreach(it in d)
		{
			it->OnPrint();
		}
	}
	std::list<Data*> d1 = { new Data(10),new Data(20), new Data(30), new Data(50),new Data(10),
	};
	LoopCall(d1, &Data::OnPrint);
	LoopCall(d1, &Data::DelPtr);
	std::cout << " end " << std::endl;
	return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在C语言中,没有直接的内建foreach循环。然而,可以使用一些技巧来模拟foreach循环的功能。引用展示了使用C++11的类型推导和std::for_each函数来模拟foreach循环的示例。在这个示例中,通过定义一个函数func来处理集合中的每个元素,并使用std::for_each函数来遍历集合并调用函数func。 另外,引用展示了一种使用宏定义来实现foreach循环的方法。这个宏定义将迭代器的初始值设为容器的起始位置,然后在每次迭代中递增迭代器。通过这种方式,可以使用foreach宏来遍历容器中的元素。 在C++中,也可以使用引用中介绍的并行std::for_each来遍历容器中的元素,并使用lambda表达式来处理每个元素。这种方法可以在并行执行的情况下提高性能。 总之,在C语言中没有直接的内建foreach循环,但可以使用一些技巧来模拟其功能,如使用函数和迭代器来遍历集合,或者使用宏定义来实现迭代循环。而在C++中,可以使用std::for_each和lambda表达式来实现foreach循环,并且通过并行执行可以提高性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [c++中的那些foreach循环](https://blog.csdn.net/xiong_min/article/details/87859214)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [c++中的 for_each 函数](https://blog.csdn.net/weixin_43165135/article/details/125526408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值