ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

配列を配列のまま関数に渡したい

何があったか

 boost.asioでネットワークIO書いてたら次のような状況が出てきた

  • 配列作る
  • 配列を関数に渡す
  • 関数内で配列全体のサイズとる(正確にはテンプレート関数の引数のマッチングの問題なんだけど意味的にはニアリイコールってことで)
  • ただし、関数の引数の方はテンプレート引数で決まる

で、関数をこんな具合に

  template<typename T>
  void func(const T val){
    socket.send(boost::asio::buffer(val), endpoint);  //ここで問題発生
  }

 ところがどっこいこれだとコンパイル通らないじゃないですか。
 エラーを読むと、valがポインタの参照として扱われている模様。ポインタじゃぁ要素数は取れないわけで、boost::asio::buffer()は要素数を調べようが無いのでにっちもさっちも行かなくなってコンパイルエラーというわけです。
 いや、正確にはポインタ渡すんなら要素数も一緒に渡さないといけないってことなんですけど。

どうした

 引数を

  const T &val

 にしただけ。こうすると、関数に配列の参照を渡す=配列をそのまま渡す、ということになるらしい。
 こうすればboost::asio::buffer()さんはvalを受け取るだけで総サイズを計算できるわけです。

実は

 書いてる途中に気づいたんだけど、今回のケースなら素直に配列の要素数を受け取る関数を用意してオーバーロードしちゃえばよかったんですよね。ちゃんちゃん。