NF

地方で働くプログラマ

13回目:デバッグ文(2)

12回目:デバッグ文 - NF
前回の続きです。
 
まず、前回の実装だと基本型はそのまま数値で出力されますが、自分でto_stringを定義してオーバライド?していました。例えばboolの値を分かり易く「true/false」で出したければ、debug_outの前に以下を書いておく感じで。

string to_string(bool b) {
  return (b ? "true" : "false");
}

前回の実行結果がこうなります。

# ./a.out
[i, f, b]: 10 3.140000 true


次に、前回載せた実装だけだとSTLとかがそのまま出せないですが、元のコードでは上と同じようにそれぞれto_stringを実装していました。例えばbitsetとかstringは以下のようになってます。他にもvectorとかpairとか定義しておけば十分そうです。

template <size_t N>
string to_string(bitset<N> v) {
  string res = "";
  for (size_t i = 0; i < N; i++) {
    res += static_cast<char>('0' + v[i]);
  }
  return res;
}

string to_string(const string& s) {
  return '"' + s + '"';
}
(snip)

int main()
{
    std::bitset<8> bs(42);
    std::string s = "str";
    debug(bs, s);

前回の実行結果がこうなります。

# ./a.out
[bs, s]: 01010100 "str"

 
あ、というか前回載せたコードでdeug_out内でto_string()呼んでるのはまさに自分で定義して出力をカスタマイズするためですね。(今気づいた)
STLとかがそのまま出せない」は言い過ぎで、stringとかは定義せずに出せますね。上のコードはダブルコーテーションで文字列囲んで分かり易くするためにやってるんですね。勘違いしてた。


そんな訳で参考になりました。
もう少し何かないか、探してみます。