C++ で Data.Tuple.Extra っぽいもの

  • 2018/06/15 01:50
  • C++
この記事は, 旧ブログから移植された記事です. よって, その内容として, 旧ブログに依存した文脈が含まれている可能性があります. 予めご了承下さい.

ふと, C++ でもこんなような記述, 普通に出来るべきなんじゃないかなぁと思った.

Prelude> :m +Data.Tuple.Extra
Prelude Data.Tuple.Extra> uncurry (+) $ first (*2) $ dupe 42
126
Prelude Data.Tuple.Extra> uncurry (+) $ (+42) &&& (*2) $ 42
168

取り敢えず, 似たような構文で同じような処理となるように作ってみた. C++11 以降では, Variadic templates が使えるので, Data.Tuple.Extra (Control.Arrow) のfirst, second関数のように, タプルの 1 番目, 2 番目に作用させるといった関数をそれぞれ別個作る必要はない. 従って, これを作用させるタプルのインデックス値で指定できるようにしてみた(srook::tuple::utility::nth). 他のものも同様, なんとなく似た感じになるように, なんとなくやってみた(?).

結局, 関数を次々と呼び出す構文をすっきりと見せるために, Range TS のようにoperator|をオーバーロードした. C++14 以降では Return type deduction が使えるが, やはり型を明示的に書きたかったので, そのあたりでいくらかテンプレートメタプログラミングをした. 個人的には久しぶりに C++ を書く上で, これが一番 C++ らしさを感じたし, 最も楽しい部分であった. このブログに移行してきて, 初の日記っぽい内容の投稿となった気がする.