#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;
}