C++

Optimized C++ 読書会 vol.2 感想

  • このエントリーをはてなブックマークに追加
  • Pocket

第2章終わりませんでした

途中でキャッシュの話で非常に盛り上がりまして、今回も進みがよくありませんでした。

その分雑談が楽しかったです(毎回脱線するのが大阪C++読書会の特徴)。

キャッシュヒット、キャッシュミスを測定するにはLinuxではperfを使えば良さげで、WindowsではVisual Studioを使えば良さげだと思いました(適当

お悩み雑談室

本日のお悩みはstd::tieについてでした。

具体的にいうとstd::tieでユーザー定義クラスの比較をしたいがうまくいかないという感じのお悩みでした。

僕が問題の本質を速攻で見抜いて、でちまるさんがズバッと解決策を提案して解決しました。

std::tieを用いて比較関数をさくっと実装できることは有名だと思います。

以下のようなコードでございます。

ちなみに、tupleの比較はStrict Weak OrderingというSTLのソートなどに要求される比較の条件を満たす。

有り体に言えば、tupleの要素を順番に比較して同じなら次を比較してって感じでいきます。

お悩みの本質

Personクラスのメンバがprivateでアクセッサが右辺値を返す場合にこれがうまくいかないというのがお悩みの本質でありました。

アクセッサが値を返すという場合、以下のような状況だと思われます。

一応実行結果貼っとくね

実はstd::tieは引数を左辺値参照で束縛します。

なので、アクセッサがconstな左辺値を返せばなんとかtieで束縛できます。

しかしながら、既存のクラスに手を入れるのはナンセンスである。

実はもっといい方法をでちまるさんが思いついたのです。

といっても大したことではありません。

右辺値は右辺値参照、左辺値は左辺値参照してtupleを作ればいいのです。

ん?それって何処かで使ったことある機能だよね?

そうです、引数をtupleとして完全転送するためのstd::forward_as_tupleをつかえばいいのです!

使い方を間違えてはいないはずです!!

めでたしめでたし。

 

  • このエントリーをはてなブックマークに追加
  • Pocket

コメント

  1. かざかざ より:

    ズバッと解決してもらったおかげで、コードすっきりしました!
    ソートしたいときにぶつかりがちな問題なので、他にも助かる人多いんじゃないかなあ

コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください