2014-01-01から1年間の記事一覧
C++ Advent Calender 2014(http://qiita.com/advent-calendar/2014/cpp) 11日目の記事です. はじめに 今年はこれまでコンパイル時の話について沢山記事にしてきたので,たまにはリンク時に関連することを記事にしてみようと思います.把握している人にとっ…
明らかにもっと共通部分を括りだす事が出来るのですが、なんとなく暇つぶしに書いたという感じなので。99だとWandboxで出力制限に引っかかってしまったようなので、ボトルを9つに減らしました。 [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ #include <boost/preprocessor/arithmetic/dec.hpp> #include <boost/preprocessor/comparison/not_equal.hpp> #include <boost/preprocessor/comparison/greater.hpp></boost/preprocessor/comparison/greater.hpp></boost/preprocessor/comparison/not_equal.hpp></boost/preprocessor/arithmetic/dec.hpp>…
trueとfalseをポインタ型と非ポインタ型に対応させることでパターンマッチが使える。再帰深度がO(1)に抑えられる。ユースケースとしては可変長引数テンプレートパラメータを受け取るコンテナとかのメンバ関数のnoexcept指定とか色々。 [Wandbox]三へ( へ՞ਊ ՞…
割と検索してくれている人が多いのでもう一度綺麗めに書き直したものを。(要C++14) type_at.cpp
[プリプロセッサ, 再帰]などで検索して来られる方が居ますがCプリプロセッサで再帰は出来ません。 プリプロセッサメタプログラミングにおける要素の走査は、再帰っぽく見えるだけで実際にはただの連番マクロを用いた展開によって実装されています。 少し実用…
Quick Q: Why can noexcept generate faster code than throw()?—StackOverflow : Standard C++ 曰く、 With the C++98 approach, the call stack is unwound to f’s caller, and, after some actions not relevant here, program execution is terminated. …
C11から導入された機能。なんというか、色々と面白い事に使えそうな感じの機能。タプルなんかと多分相性が良い。曲芸的濫用についてはまた今度考える。 ラムダ式でオーバーロードする最も簡単な方法かもしれない。 http://melpon.org/wandbox/permlink/14pwv…
N4072: Fixed Size Parameter Packs O(1) #include <type_traits> template <typename T> struct identity { using type = T; }; template <std::size_t N, typename Tuple> struct at; template <std::size_t N, template <typename...> class Tuple, typename... Types> struct at<N, Tuple<Types...>> { template </n,></std::size_t></std::size_t></typename></type_traits>
FTMPのメタ関数で使われている畳込みの実装アプローチをソースコードと勉強会で発表された資料を参考に理解した(気になった)ので、constexprで再現してみました。パックの分割に当たる操作と、相互再帰を利用して畳み込みがうまく実現されています。foldlとf…
N4072: Fixed Size Parameter Packsという提案が出ています。 参考記事: 本の虫: 2014-07 post Rapperswil mailingのレビュー: N4070-N4079 そこにこのような例があります。 template<unsigned int N, unsigned int M> void f(int...[N], int...[M]) {} f<2>(1,2,3); // M is deduced as 1. (</unsigned>…
たぷる系。面白いと思ったので紹介。 c++ - Is there a name for this tuple-creation idiom? - Stack Overflow
もう少しマシに出来ないだろうか http://melpon.org/wandbox/permlink/ECTzA3hv0pkHUlFo
overloaded_function, fusedの関数ポインタ対応を済ませました。 これでoverloaded_function, fusedの当面の目標を一通り実装しました。 また別のネタを模索しようと思います。
ちょっと頑張ってmake_overloadやmake_fusedでラムダ式も扱えるようにしました。 https://github.com/fimbul/shiro/blob/master/shiro/functional/overloaded_function.hpp https://github.com/fimbul/shiro/blob/master/shiro/tuple/fused.hpp これで以下の…
実験的なライブラリなので、後々仕様変更などをするかもしれませんが、とりあえずshiro::tupleに対して使えるfusedまで実装しました。現状overloaded_functionが扱えるのは関数オブジェクトだけですが、のちのちboost::overloaded_functionのように関数オブ…
typename index_tuple_cat<index_tuple<Indices1...>, index_tuple<Indices2...>, ..., index_tuple<IndicesN...>>::typeがindex_tuple<Indices1..., Indices2..., ..., IndicesN...>となるようなメタ関数を書きました。 https://github.com/fimbul/shiro/blob/master/shiro/utility/index_tuple_cat.hpp</indices1...,></indicesn...></indices2...></index_tuple<indices1...>
以下のページで2012年の時点でインデックスを割り振って多重継承するというアプローチが紹介されていたようです。ここまでtupleの実装について丁寧に解説してくれている記事もなかなか無いと思います。もっと早く知りたかった。 http://mitchnull.blogspot.j…
ユーザコードでループを使う代わりに、ループの役割を分担した高階関数を状況に応じて使い分ける方が良いスタイルだろうという話。 What's Wrong with the For Loop http://notes-on-haskell.blogspot.jp/2007/02/whats-wrong-with-for-loop.html 「for ルー…
最近よかったもの、記事の紹介。 c++11constexprでコンパイル時バイトニックソートを大雑把に実装した http://txt-txt.hateblo.jp/entry/2014/07/14/234526 バイトニックソートは再帰オーダーO((log N)2)で実装することができるconstexpr化可能なアルゴリズ…
C++ Exception Handling for IA-64 http://static.usenix.org/events/osdi2000/wiess2000/full_papers/dinechin/dinechin_html/ SJLJ / Exception Handling Tablesそのものの導入コスト 例外機構を使う結果として起こる最適化の阻害 例外発生時にデストラク…
merge_sortのマージ部分の再帰深度を抑えられないかという話。 手始めにソート済み配列に、再帰深度対数オーダーで1要素追加することを考えた。 http://melpon.org/wandbox/permlink/nIsePEbv8EY3D9Lo しかし、再帰深度は抑えられたものの、これは考えうる配…
ドワンゴC++勉強会 #1 に参加しました。 メインセッション、LTセッション共に面白い話が聞けて非常に良かったです。 自分もconstexpr idiomsという題でLTさせて頂きました。 index_tuple、パラメータパックの分割、分割統治、型のmapなどこれまでここに書い…
面白いアイデア、優れた実装がタイムラインに刹那的に埋没していくのは勿体無いこと。 新しいtype_traits案。とりあえずremove実装 [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ http://t.co/KLZ6TBnw6L— プププランドのプリンス RiSK (@sscrisk) June 14, 2014 [Wandbox]…
高さ1のN分木の形ではなく、高さO(logN)の二分木の形に多重継承することで、usingがパック展開で書けない問題を回避しつつ、再帰深度をO(logN)に抑えました。関数の引数ではなく多重継承に適用しただけで、発想としては前回記事と同じです。type_tupleの要素…
constexprでのN引数関数の実装の改良( http://fimbul.hateblo.jp/entry/2014/06/03/194207 )にてパラメータパックを二分割し、分割統治法を適用する実装を見出し、C++11 constexprでマージソートが現実味を帯びてきたため早速実装に挑戦した。 結果、gcc, cl…
愚直に線形再帰して1つずつ処理していくとやはり再帰深度が問題になる。 分割統治法を用いることで実装を改良することが出来る。 tuple_elementでN番目の型を対数オーダーで取り出す際に用いた考え方の応用でN/2までのindex_tupleを上手に使うと引数のパック…
以下の記事と全く同じ事にハマった。 小ネタ - constexpr の文脈でconstメンバ関数と非constメンバ関数を呼び分ける http://boleros.hateblo.jp/entry/20120331/1333187905 その際に、追加でハマった事を捕捉的に書いておく。 引数がrvalue referenceであっ…
関連項目 make_overloadを書いた http://fimbul.hateblo.jp/entry/2014/05/10/162852 再帰深度を抑えたtuple的コンテナの構築 http://fimbul.hateblo.jp/entry/2014/05/25/014112 前回記事(関連項目2つ目)でも登場した テンプレートパラメータにKeyとValueを…
本当に一部の機能のみ実装。要素型とindexをテンプレートパラメータにペアにして保持するvalue_holderを多重継承する方針。make_overloadの際に初めて知った、テンプレート引数を展開しながら一気に多重継承するという技法を早速パクりました。getでindexを…
Indexの数字を増やしながらvisitorを適用しつつ線形再帰する方法もあるけれど、index_tupleを用いて再帰深度を抑えてやる方が良い気がするのでそのように実装した。 tupleの状態を変更したい場合は参照で受け取って値を書き換える関数を渡すと良さそう。cons…