LoginSignup
2
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-10

構造体メンバ変数をそのまま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;
  }
}

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

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

2
4
15

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4