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