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 これで以下の…

overloaded_function, fusedを実装した。

実験的なライブラリなので、後々仕様変更などをするかもしれませんが、とりあえずshiro::tupleに対して使えるfusedまで実装しました。現状overloaded_functionが扱えるのは関数オブジェクトだけですが、のちのちboost::overloaded_functionのように関数オブ…

index_tuple_catを書いた

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...>

tupleの実装記事の紹介

以下のページで2012年の時点でインデックスを割り振って多重継承するというアプローチが紹介されていたようです。ここまでtupleの実装について丁寧に解説してくれている記事もなかなか無いと思います。もっと早く知りたかった。 http://mitchnull.blogspot.j…

What's Wrong with the For Loop

ユーザコードでループを使う代わりに、ループの役割を分担した高階関数を状況に応じて使い分ける方が良いスタイルだろうという話。 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

ドワンゴC++勉強会 #1 に参加しました。 メインセッション、LTセッション共に面白い話が聞けて非常に良かったです。 自分もconstexpr idiomsという題でLTさせて頂きました。 index_tuple、パラメータパックの分割、分割統治、型のmapなどこれまでここに書い…

ここ最近おもしろかったもの

面白いアイデア、優れた実装がタイムラインに刹那的に埋没していくのは勿体無いこと。 新しいtype_traits案。とりあえずremove実装 [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ http://t.co/KLZ6TBnw6L— プププランドのプリンス RiSK (@sscrisk) June 14, 2014 [Wandbox]…

overloaded_functionの再帰深度を抑えた

高さ1のN分木の形ではなく、高さO(logN)の二分木の形に多重継承することで、usingがパック展開で書けない問題を回避しつつ、再帰深度をO(logN)に抑えました。関数の引数ではなく多重継承に適用しただけで、発想としては前回記事と同じです。type_tupleの要素…

C++11 constexprでマージソート

constexprでのN引数関数の実装の改良( http://fimbul.hateblo.jp/entry/2014/06/03/194207 )にてパラメータパックを二分割し、分割統治法を適用する実装を見出し、C++11 constexprでマージソートが現実味を帯びてきたため早速実装に挑戦した。 結果、gcc, cl…

constexprでのN引数関数の実装の改良

愚直に線形再帰して1つずつ処理していくとやはり再帰深度が問題になる。 分割統治法を用いることで実装を改良することが出来る。 tuple_elementでN番目の型を対数オーダーで取り出す際に用いた考え方の応用でN/2までのindex_tupleを上手に使うと引数のパック…

moveを阻害しないconstexprの文脈でのconstメンバ関数と非constメンバ関数の呼び分け

以下の記事と全く同じ事にハマった。 小ネタ - constexpr の文脈でconstメンバ関数と非constメンバ関数を呼び分ける http://boleros.hateblo.jp/entry/20120331/1333187905 その際に、追加でハマった事を捕捉的に書いておく。 引数がrvalue referenceであっ…

overloaded_function再び

関連項目 make_overloadを書いた http://fimbul.hateblo.jp/entry/2014/05/10/162852 再帰深度を抑えたtuple的コンテナの構築 http://fimbul.hateblo.jp/entry/2014/05/25/014112 前回記事(関連項目2つ目)でも登場した テンプレートパラメータにKeyとValueを…

再帰深度を抑えたtuple的コンテナの構築

本当に一部の機能のみ実装。要素型とindexをテンプレートパラメータにペアにして保持するvalue_holderを多重継承する方針。make_overloadの際に初めて知った、テンプレート引数を展開しながら一気に多重継承するという技法を早速パクりました。getでindexを…

tupleの要素を走査する

Indexの数字を増やしながらvisitorを適用しつつ線形再帰する方法もあるけれど、index_tupleを用いて再帰深度を抑えてやる方が良い気がするのでそのように実装した。 tupleの状態を変更したい場合は参照で受け取って値を書き換える関数を渡すと良さそう。cons…

make_overloadを書いた

きっかけは@sscriskさんがTwitterで次のようなおもしろコードを貼っていたことです。 http://melpon.org/wandbox/permlink/vfXMZR8lGs78NGs6 auto f = make_overload( [](int i){ std::cout << "int: " << i << '\n'; }, [](double d){ std::cout << "double…

コンパイル時ナベアツ問題

Twitterでそれとなく言われたのでやりました。 マンデルブロ集合よりもずっと簡単でした。 index_tuple idiomを使って範囲内の数に対して条件判定を行って結果の文字列を格納した配列をmake_common_arrayで作って返してやる。特筆すべきことはありません。 …

コンパイル時にマンデルブロ集合を計算する

マンデルブロ集合(http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%B3%E3%83%87%E3%83%AB%E3%83%96%E3%83%AD%E9%9B%86%E5%90%88)とは有名な 複素平面上の集合、及びそれを複素平面上にプロットしたフラクタル図形の呼称です。 簡単に計算出来、比較的見栄えの…

private: operator void() const;

Twitterで教えてもらって読んでみておもしろかったので http://togetter.com/li/38905

本日新たに提案されたリテラル

本日公開されたペーパー(http://bit.ly/1lylvo7) 標準にC++コード内に文鳥言語のコードを埋め込む為のBuncho Literalという新しいリテラルを追加しようという提案です。 ペーパーでは◔⊖◔プリフィックスの後にダブルクオートで囲まれた文鳥言語のコードを埋め…

関数テンプレートを使ってメタ関数の実装を書く

特にメリットとか無いのですが、こういう風にも書けるわなと思ったので書いてみました。 #include <type_traits> template<std::size_t... Indices> struct index_tuple {}; template<std::size_t M, std::size_t N> struct index_range { private: template<std::size_t STEP, std::size_t LAST, std::size_t... Indices> static auto impl(typename std::enable_if<…</std::size_t></std::size_t></std::size_t...></type_traits>

templateキーワードを複数行書くケース

sprout::tupleの実装などに見られる。ネストされたtemplate関数の実装を書く場合等に使う。あまり見かけないからか、解説されてない気がしたのでメモ程度に残しておきます。複数書く場合は、外側のテンプレートに対応するものから順番に書きます。 template <typename T1, typename T2></typename>…

tupleからvariantのarrayに変換する

タイトル通りです。もしかしたら便利な事があるかもしれません。 #include <sprout/tuple.hpp> #include <sprout/array.hpp> #include <sprout/variant.hpp> #include <sprout/index_tuple.hpp> template <typename... Types, sprout::index_t... Indices> constexpr auto tuple_to_varray_impl(const sprout::tuple<Types...>& t, const sprout::index_tu…</types...></typename...></sprout/index_tuple.hpp></sprout/variant.hpp></sprout/array.hpp></sprout/tuple.hpp>

apply

関数オブジェクトとtupleを渡すとtupleの各要素を引数として関数を呼び出すいわゆるapplyの動作をする関数を実装してみました。sproutには既にmake_fusedという非常に便利な関数があるのでこれを適用した後に関数を呼び出す処理までをラップすれば同じ効果が…

C++の剰余の定義

例えば負の数の絡むC++の剰余の計算結果は?そもそもC++の剰余演算の定義は。 調べたところstackoverflowに回答がありました。 http://stackoverflow.com/questions/7594508/modulo-operator-with-negative-values C++03では実装依存のようですが、C++11では…

プリプロセッサで基数変換

10進数→2進数 実装は非常に簡単(http://melpon.org/wandbox/permlink/NKeqHAbRSTsYap0a) #include <boost/preprocessor.hpp> #define PRED(n, state) BOOST_PP_TUPLE_ELEM(2, 1, state) #define OP(d, state) \ (BOOST_PP_CAT(BOOST_PP_MOD(BOOST_PP_TUPLE_ELEM(2, 1, state), 2), \ </boost/preprocessor.hpp>…

zipのような

前の記事でunzipのようなものを書いたので逆の、sprout::tuple<sprout::array<Types>...>からsprout::array<sprout::tuple<Types...>>への変換も書きました。長さが違う場合、短い方に合わせます。最も要素数の少ない配列の要素数探索を行う際のオーダーがO(N)ですが、対数オーダーでソートしてから二分探</sprout::tuple<types...></sprout::array<types>…

unzipのような

車輪の再発明だと思いますが、sprout::array<sprout::tuple<Types...>>からsprout::tuple<sprout::array<Types>...>を作って返す関数を実装してみました。アイデアはHaskellのunzip関数です。 Wandbox http://melpon.org/wandbox/permlink/aRxrOWetWilTbwZ3 #include <sprout/tuple.hpp> #include <sprout/array.hpp> #include <sprout/index_tuple.hpp> template </sprout/index_tuple.hpp></sprout/array.hpp></sprout/tuple.hpp></sprout::array<types></sprout::tuple<types...>