2014-01-01から1年間の記事一覧

リンク時に関連するルールの話

C++ Advent Calender 2014(http://qiita.com/advent-calendar/2014/cpp) 11日目の記事です. はじめに 今年はこれまでコンパイル時の話について沢山記事にしてきたので,たまにはリンク時に関連することを記事にしてみようと思います.把握している人にとっ…

99 bottles of beer

明らかにもっと共通部分を括りだす事が出来るのですが、なんとなく暇つぶしに書いたという感じなので。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>…

TMPでboolの計算 (memo)

trueとfalseをポインタ型と非ポインタ型に対応させることでパターンマッチが使える。再帰深度がO(1)に抑えられる。ユースケースとしては可変長引数テンプレートパラメータを受け取るコンテナとかのメンバ関数のnoexcept指定とか色々。 [Wandbox]三へ( へ՞ਊ ՞…

Template Parameter Packの要素へのアクセス

割と検索してくれている人が多いのでもう一度綺麗めに書き直したものを。(要C++14) type_at.cpp

プリプロセッサでFOR_EACHを実現する

[プリプロセッサ, 再帰]などで検索して来られる方が居ますがCプリプロセッサで再帰は出来ません。 プリプロセッサメタプログラミングにおける要素の走査は、再帰っぽく見えるだけで実際にはただの連番マクロを用いた展開によって実装されています。 少し実用…

何故noexceptの方がthrow()より高速なコードを生成出来るのか?

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

_Generic

C11から導入された機能。なんというか、色々と面白い事に使えそうな感じの機能。タプルなんかと多分相性が良い。曲芸的濫用についてはまた今度考える。 ラムダ式でオーバーロードする最も簡単な方法かもしれない。 http://melpon.org/wandbox/permlink/14pwv…

memo

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 は期待出来る

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

Is there a name for this tuple-creation idiom?

たぷる系。面白いと思ったので紹介。 c++ - Is there a name for this tuple-creation idiom? - Stack Overflow

メモ

もう少しマシに出来ないだろうか http://melpon.org/wandbox/permlink/ECTzA3hv0pkHUlFo

overloaded_function, fusedの関数ポインタ対応を済ませた

overloaded_function, fusedの関数ポインタ対応を済ませました。 これで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 これで以下の…

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…