C++ で Data.Tuple.Extra っぽいもの
- 2018/06/15 01:50
-
ふと, 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++ らしさを感じたし, 最も楽しい部分であった. このブログに移行してきて, 初の日記っぽい内容の投稿となった気がする.
活動継続のためのご支援を募集しています