ループ変数を回すだけの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)