ループ変数を回すだけのFORマクロ
普段、配列と std::vector ばかり使うので、BOOST_FOREACH よりも、単純にループ変数を回すコードが簡単に書ける方が嬉しい。
for (int i = 0, n = v.size(); i < n; ++i) { ... } FOR_INDEX (int i, v) { ... }
そのためのマクロを書いてみた。
#include <cstddef> #include <iostream> template <class C> std::size_t size(const C &c) { return c.size(); } template <class A, std::size_t N> std::size_t size(const A (&)[N]) { return N; } #define FOR_INDEX(i,c) \ for (std::size_t FOR_i = 0, FOR_n = size(c); FOR_i < FOR_n; ++FOR_i) \ if (bool FOR_c = false);else \ for (i = FOR_i; !FOR_c; FOR_c = true) int main() { const char* a[] = { "One", "Two", "Three" }; FOR_INDEX(int i, a) { std::cout << i + 1 << ":" << a[i] << std::endl; } } /* 1:One 2:Two 3:Three */
追記: breakとcontinueのこと忘れてたので修正。これでいいはず。
#define FOR_INDEX(i,c) \ if (bool FOR_c = false);else \ for (std::size_t FOR_i = 0, FOR_n = size(c); !FOR_c && FOR_i < FOR_n; ++FOR_i, FOR_c = !FOR_c) \ for (i = FOR_i; !FOR_c; FOR_c = true)