C++
Arduino

Arduinoで雑streamのような何か

More than 1 year has passed since last update.

コード

struct my_stream_tag{};

template<typename T> my_stream_tag const& operator<<(my_stream_tag const& os, T const& t){
      Serial.print(t);
      return os;
}

static constexpr my_stream_tag cout;

static constexpr auto endl = '\n';

これをコードの先頭にコピペしておけば、こんな書き方ができるようになります

void setup() {
  Serial.begin(9600);
}

int cnt = 0;

void loop() {
  cout << "count is: " << cnt << endl;
  cnt++;
}

名前衝突が気になる方は適当にnamespaceにぶち込んでお使いください。
というかこれstreamじゃないですよね。streamチックな書き方というか

Arduinoの出力インターフェース

例えばvaluestateという変数があったとして"Value is: ??? and state is: ???"という出力が欲しかった時に、Arduinoだとこう書くことになります

Serial.print("Value is: ");
Serial.print(value);
Serial.print(" and state is: ");
Serial.println(state);

正直言ってめんどいです

普通なら

std::cout << "Value is: " << value << " and state is: " << state << std::endl;

これで済んで楽チンなのですが残念ながらArduinoにはSTLがない。

しかしありがたいことにSerial.printは色々な型にオーバーロードされているので, operator<<の右辺をそのままSerial.printに投げれば擬似std::coutが実現できます。

という、便利っちゃ便利かもしれないけどわざわざコピペするほどでもない感じのTips(