C ++ foreachの実装

C ++ foreach

注:私はオリジナルです。類似点が見つかった場合は、結果に対して責任を負います

C ++ 11

C ++ 11が直接サポートされ、判断__cpp_range_based_forの価値がある場合、200907Lサポートされます

#include <iostream>
#include <vector>

int main(void)
{
    
    
	std::vector<int> vec{
    
    1,2,3,4,5};
	
#if __cpp_range_based_for >= 200907L
	for (int var : vec)
	{
    
    
		std::cout << var << std::endl;
	}
#endif
}

出力結果

1
2
3
4
5

C ++ 11より前


ファイル名を制御するために記述できるクラスは1つだけです。foreach.hpp

// foreach.hpp
#ifndef FOREACH_HPP
#define FOREACH_HPP

template <typename container_type>
class Foreach_container
{
    
    
public:

    Foreach_container(const container_type &c) : begin(c.begin()), end(c.end()) {
    
    }
    Foreach_container(container_type &c) : begin(c.begin()), end(c.end()) {
    
    }

    decltype(container_type().begin()) begin, end;
    bool f = true;
};

#define FOREACH(var, container)                                                \
for (auto _container_ = in::Foreach_container<decltype(container)>(container); \
    _container_.f && _container_.begin != _container_.end;                     \
    ++_container_.begin, _container_.f = true)                                 \
                                                                               \
    for (var = *_container_.begin; _container_.f; _container_.f = false)

#ifndef foreach
# define foreach FOREACH
#endif

#endif // FOREACH_HPP

指示

#include <iostream>
#include <vector>
#include "foreach.hpp"

int main(void)
{
    
    
	std::vector<int> vec{
    
    1,2,3,4,5};
	
	// 使用foreach宏
	foreach (int var, vec)
	{
    
    
		std::cout << var << std::endl;
	}
}

出力結果

1
2
3
4
5

組み合わせる

#include <iostream>
#include <vector>

#if __cpp_range_based_for >= 200907L

	#define FOREACH(var, container) for (var : container)
	
#else
	template <typename container_type>
	class Foreach_container
	{
    
    
	public:
	
	    Foreach_container(const container_type &c) : begin(c.begin()), end(c.end()) {
    
    }
	    Foreach_container(container_type &c) : begin(c.begin()), end(c.end()) {
    
    }
	
	    decltype(container_type().begin()) begin, end;
	    bool f = true;
	};
	
	#define FOREACH(var, container)                                                \
	for (auto _container_ = in::Foreach_container<decltype(container)>(container); \
	    _container_.f && _container_.begin != _container_.end;                     \
	    ++_container_.begin, _container_.f = true)                                 \
	                                                                               \
	    for (var = *_container_.begin; _container_.f; _container_.f = false)
#endif

#ifndef foreach
# define foreach FOREACH
#endif

int main(void)
{
    
    
	std::vector<int> vec{
    
    1,2,3,4,5};
	
	// 使用foreach宏
	foreach (int var, vec)
	{
    
    
		std::cout << var << std::endl;
	}
}

おすすめ

転載: blog.csdn.net/m0_47534090/article/details/108780357