Arduino
C++11

構造体メンバ変数を直接、範囲for文で回してみた

構造体メンバ変数をそのままforで回せたらいいな、と思うことありますよね?
こんな感じで。

#include <iostream>

struct A{
  int aa;
  int bb;
  int cc;
};

A a {1,2,3};

int main(void){
  for(const auto& d: a){
    std::cout << d << std::endl;
  }
}

でもこれはうまくいかないようです。paiza.ioで試してみました。

//コンパイルエラー
Main.cpp:14:20: error: invalid range expression of type 'A'; no viable 'begin' function available
  for(const auto& d: a){
                   ^ ~
1 error generated.

怒られちゃいました。

参考にした範囲for文によると

語弊を恐れず言えば、メンバ関数にbegin()およびend()を持つクラスであれば、何でも範囲for文の範囲として指定できる。

そうなので、始まりと終りの場所を返す関数をてきとーに作ってくっつけてみました。
aa,bb,ccの順に並んでるとして、beginは自分自身のaaの場所、endは自分自身のccの後、といった気持です。

#include <iostream>

struct A{
  int aa;
  int bb;
  int cc;
  int* begin( )  {return &this->aa     ; };
  int* end( )    {return &this->cc + 1 ; };
};

A a {1,2,3};

int main(void){
  for(const auto& d: a){
    std::cout << d << std::endl;
  }
}

//出力結果
1
2
3

動いた!

Arduinoでもやってみました。
スクリーンショット 2017-08-10 19.51.11.png
動いた!

これで多値をまとめて処理したりするのがちょっと簡単になるかも。

動いてるので取り敢えず使いたいと思います。やっぱりやめた。こっちにします。詳細はコメント見てください。

#include <iostream>

struct A{
  int bb[3];
};

A a { {1,2,3} };

int main(void){
  for(const auto& d: a.bb){
    std::cout << d << std::endl;
  }
}

ちょっと表題とは違ってくるけど、同じようなことができる。

ざっくりとした考えでやってるんで、違うよ、もっといい方法があるよ、というのがあればコメントお願いします。