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

constexpr で テンプレートメタプログラミング

C++

この記事はC++ AdventCalendar2014 6日目の記事になります 祝C++14!!祝C++14!!祝C++14!!祝C++14!!C++14においてconstexprの大幅な規制緩和が制定された これによりconstexprにおいてforなどループ文の記述が可能になった 一方そのころTMPは 残念ながらテンプ…

デジゲー博で頒布したはるはあけぼのの不具合について

デジゲー博で頒布したゲームにいくつか不具合が見つかりました 申し訳ありませんお手数ですが以下のファイルの中身をすべてゲームのフォルダにコピーしてください。同じ名前のものは置き換えてください。 https://www.dropbox.com/sh/p7foxjuvncedu8p/AAAi6b…

本日(11/16)開催のデジゲー博に参加します。C-02a TXT.TXTです。

ゲームが出来たてほやほやなので取り急ぎ告知と宣伝 自爆しちゃう系STG「はるはあけぼの、我は弾丸」を頒布します C-02a です ■おはなし およそ50年ほど前、地球温暖化対策として植林したバイオ植物が思いのほか育ちすぎてしまいました 元気な植物たちは盛ん…

標準ライブラリに重複した型を取り除くuniqueifyが入るかもしれないっていうからuniqueの実装について

C++

本の虫: 2014-10-pre-Urbanaのレビュー: N4142-N4149 曰く重複した型を取り除くuniqueify が追加されるかもらしい そこで実装の話俺俺ライブラリOTMPよりuniqueuniqueはタイプリストを受け取り重複した型を取り除き返す unique_t<List<char,int,long,int>>;//List<char,int,long> この処理は「二つの</char,int,long></list<char,int,long,int>…

LocalTypeHashというかKeyにかぶりがあってもコンパイルを通す型mapの種

受け取ったタイプリストに対し適当な数字を被らないように返すLocalTypeHashメタ関数を作りたい using TypeHash=makeTypeHash<List<char,int void>>; TypeHash::apply<char>//0 TypeHash::apply<int>//1 TypeHash::apply<void>//2こんな感じしかして型が被った場合どうなるだろうこの場合このまま</void></int></char></list<char,int>…

VS2013で破綻した型の名前を出力してたら{ctor}の文字が出てきた

タイトルで話が完結している namespace minibug { template<class ...T> struct List{}; template<class...T> std::true_type length_impl(List<T...>); template<class T> struct wrap{ using type = T; }; template<class T> using identity = typename wrap<T>::type; template<class list> using length = identity</class></t></class></class></t...></class...t></class>

VS2013で遭遇した最悪なバグ

自分が遭遇した最悪なバグを書いておこうと思う 型破壊バグ std::cout << typeid(BreakType).name();//struct ??::??と出力される //error C2133:サイズが不明です //error C2512:コンストラクタがない BreakType c; 上記のように壊れた型が発生する初代ポケ…

メタ関数の高階関数

C++

apply<sprout::types::quote<F>, Args...>::type は F<Args...>::type を返す— 狂える中3女子ボレロ村上/陶芸C++er (@bolero_MURAKAMI) 2014, 8月 18 apply<sprout::types::self<F>, Args...>::type は F<Args...> を返す— 狂える中3女子ボレロ村上/陶芸C++er (@bolero_MURAKAMI) 2014, 8月 18 これらの動作は Boost.MPL で</args...></sprout::types::self<f></args...></sprout::types::quote<f>…

「脱アルゴリズム宣言」読書ノート

この話で出てくる「アルゴリズム」「脱アルゴリズム」という単語について ここでいうアルゴリズムとは命令型言語的なアルゴリズムを指している なので必要に応じて「アルゴリズム」という単語を「(命令型言語的)アルゴリズム」と脳内正規表現マッシーンっで…

c++11constexprでコンパイル時バイトニックソートを大雑把に実装した

C++

ネタではなく非常に強力であり実用的なソートである //コード bitonic_sort.hpp //実行結果 [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッちなみに一部コードは C++11 constexprでマージソート - ここは匣 から借りてきた バイトニックソートとはマージソートの亜種であり…

c=pow(2,k)のとき、n xor cはn + c*((n/c) mod 2 ? -1:1)と等しいらしい

解説 c == pow(2,k) == (1<<k)n + c*((n/c) mod 2 ? -1:1) → n + c*((n/(1<<k)) mod 2 ? -1:1) → n + c*((n>>k)mod 2?-1:1) → n + c*([nのk番bitが立っているか]?-1:1) → [nのk番が立っているか] ? n-c :n+c → [nのk番が立っているか]? [nのk番を折る] :[nのk番を立てる] → n^c</k)n>

constexprで無限リスト作った

C++

こんな感じ struct Func { constexpr int operator()(int i)const { return i+1; } }; make_recurrence_list(0,Func{});//0,1,2,3,4... 無限だから長さを求めようとすると無限ループ起こしてコンパイラが死ぬ 単方向リストだから巻き戻しもできない かいてて…

ドワンゴC++勉強会 #1に行ってきた

タイトルの通りである ドワンゴC++勉強会 #1 - connpass constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。CPUの嬌声が聞こえてきそうだ *1 発表者:ボレロ村上氏 資料:http://www.slideshare.net/GenyaMurakami/onstexprcpu*2 内容は(…

Boost.mpl11を読んだ

C++

ldionne/mpl11 · GitHub自分の大雑把な理解。間違ってたら指摘してもらいたいmpl11は基本的に遅延評価である。ゆえに極力計算しないBoxed typesとは多くのメタ関数やtype_wrap などT::typeとできる型のことであるmpl11のメタ関数は基本的にboxed typeを引数…

私がvisitorパターンが嫌いな理由

私には昔から、GOFのデザインパターンというものを学習したときからどうにも『そり』が合わないデザインパターンがあった visitorパターンである別に理解できなかったわけではない。使えないわけでもない。実際何度か使う場面もあった だが、思いだすたび、…

C++11なvariantを大雑把に実装した

C++

variant test variant C++11仕様だから20個以上の要素が詰め込めるよ!!COOLCATって感じだ コンストラクタとデストラクタ、あとapplyだけ実装してある 以下にget関数の簡易な実装を示す template<class T> struct Get { T operator()(const T&x)const { return x; } </class>…

VS使いだけどwandboxでconstexpr二分木fold関数作った

グィスト constexpr binary fold実際に(静的に)実行したものはこちら wandbox [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ二分木foldとは文字通り二分木で畳み込み関数である binary_fold(plus{},1,2,3,4,5)は以下のように解決される ((1 + 2) + (3 + (4 + 5))) foldlやf…

tuple操作ライブラリ「tupleple」

C++

ギッハッハブ Fuyutsubaki/tupleple · GitHubタプルプルプルタプルプル ご意見もらえると喜びますできること一覧 at N番目の要素にアクセスする apply タプルに関数を適用する view おおむね元要素へのアクセスのインデックスを架け替えてるだけである 基本…

マクロフリーの健全なテストライブラリをちょっと作ってみた

マクロは邪悪であり害悪である 故にマクロは滅びなければならない 滅ぼさなければならない。存在してはならない。これは人間の義務である頭の中でワンワンと神が嘶くのでマクロフリーなテストライブラリもどきを作っていたgist マクロ無しの健全なテストライ…

規格的にヤバそうな限定type_hashメタ関数を作ったけどGCCで動かないし、別の実装とかも考えたけどそれもダメくさいしもうだめだ

再帰深度を抑えたtuple的コンテナの構築 - ここは匣 コレの最後の部分を逆に動かしたら指定された方だけに対応するhash関数が作れるのではとか考えてみたVSとClangでは動いたというのに。2対1だけど規格的にどっちが正しいのかわからない 間違ってる気さえ…

対数オーダー再起で構築されるtupleのギミックを大雑把に実装した

C++

(追記)こっちも読め。こっちのがいい 再帰深度を抑えたtuple的コンテナの構築 - ここは匣 (追記終わり)調査環境はVS2013のみ たぶんO(log N)で動く コード中のstd::tupleはtype_listの代わりに使った。std::tupleを入れると実は対数オーダーにならないんじゃ…

VSでも動くパラメーターパックヘルパーを作った

C++

https://gist.github.com/Fuyutsubaki/e798e6c8d9265d020b4d これ template<size_t N ,class Func> class drop_functor { template<class F> drop_functor(F&&f); template<class...T> auto operator()(T&&...args); }; template<size_t N,class Func> auto make_drop(Func&&func) ->drop_functor<N, Func>; N個dropして関数を適用して</n,></size_t></class...t></class></size_t>…

対数オーダーでN番目の引数にアクセスするvalue_at的関数

C++

夜 (fimbul11) on Twitter さんの Template Meta Programming入門から応用までの367ページ当たり見ながら書いた 深度O(logN)で動くvalue_at的な関数http://melpon.org/wandbox/permlink/i0YgUwd8wdsJBDJE gccとClangで動作確認。VSではstd::index_sequenceが…

const 参照と右辺値参照と一時オブジェクトの寿命、あとforward_as_tupleとか

C++

一時オブジェクトとはこれである x+y; Type(); 要するに変数に関連付けられていないオブジェクトのことであるこいつ等の寿命は式が終わるまで、つまりセミコロンが出てくるまでである void f(const std::string&s); //main //fを処理する段階ではまだ生きて…

二項演算子をクラス内でオーバーロードしたテンプレートクラスをテンプレート関数で返してdecltype内で演算すると C2677 エラーが起きて最高に意味不明

template<class> struct rhs { friend int operator*(int x, rhs){ return 2; } }; template<class T> rhs<T> make(T){ return rhs<T>(); } using R = decltype(42 * make(42)); int main(){} 自身が右辺に来る二項演算子を クラス内でオーバーロードした テンプレートクラスを テ</t></t></class></class>…

メイドでもよく分る右辺値参照

C++

本日2014年 2011年から早3年。C++11も浸透してきた、してきてる、してきて欲しいなという時分ですね 冬椿です。ファミレスに行ったらカレーがメニューから消えてました。こんばんはC++11で追加された機能の一つに『右辺値参照』というものがあります こいつ…

そうだ、reverse関数を実装しよう

某社に面接に行ってきました。 で、そこで「reverse関数書いて(意訳)」と言われたので書いてきた void reverse(std::string& str) { size_t N = str.size(); for (size_t i = 0; i < N/2; ++i) std::swap(str[i], str[N - 1 - i]); } こんなの。CodeIQなら★…

VisualStudio2013のバグ?alias templateにT::valueやT::typeやvariadic-templateを使うとC2955エラーなど不都合が起こる

VisuakStudio2013のバグ?エイリアステンプレートにエイリアステンプレートを使うとC2955エラーを吐く - TXT.TXTの問題をちゃんと分析しなおした テストコードはーい template<size_t N> struct Index{ static const size_t value = N; }; template<class T> using foo = typena</class></size_t>…

タイプリストに対するmapの実装とC++11のテンプレートメタプログラミング

C++

なんかむらむらする。プログラムを書くっていう日じゃない のでちょっと自作ライブラリtupleple::type_list::mapについて書きたいまず何がやりたいか、サンプルを書く using tuple=std::tuple<void,int,char>; using result=map<std::add_pointer,tuple>::type; static_assert(std::is_same<result,std::tuple<void*,int*,char*>>::value,</result,std::tuple<void*,int*,char*></std::add_pointer,tuple></void,int,char>…

index tuple idiomについてと、std::integer_sequenceとかについて考える事

現在私はtuplepleという、boost.fusionのC++11版になりたいタプル操作ライブラリを作っている 作り始めた理由はちょっと込み入ったことをしようと思うと必ずタプル操作が必要になったからだで、製作途中でindex_tuple_idiomというのを思いついた 厳密に言う…