入れ子にすればN^2個に展開

#include <iostream> template <typename... Ts> int f(Ts... i) { int k = 0; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-value" (... , (i, (... , (++k, i)))); #pragma GCC diagnostic pop return k; } int main() { std::cout << f(0) << std::endl; </typename...></iostream>…

Folding-expressionを用いてparameter pack長のindex_sequenceを構築する

再帰深度がO(1)に抑えられる.(趣味) melpon.org #include <type_traits> template <int... Ns> struct V; template <int N, int... Ns> struct V<N, Ns...> { template <int M> V<N + 1, N, Ns...> operator +(V<M>); }; template <> struct V<> { template <int M> V<0> operator +(V<M>); }; template <typename... Types> struct S { …</typename...></m></int></m></n></int></n,></int></int...></type_traits>

Traktor + Max/Jitterで楽曲に合わせた映像のポン出しを自動化する

要約 [背景] クラブでは楽曲に合わせてVJさんが映像を出してくれる [目的] 一人でおうちDJをする際にもアニソンにはOP動画やミュージッククリップといった映像を出したい [提案] Traktorのbroadcast経由で楽曲情報を持ってきてMax/Jitterで映像を出す [結論]…

coutで多次元配列のdump

何かの役に立つかも 実行結果 http://melpon.org/wandbox/permlink/MJN1EGWMw1ixnvBJ #include <iostream> template <typename T, std::size_t N> std::ostream& operator<< (std::ostream& os, const T(&arr)[N]) { os << '{'; std::size_t i = 0; for (const auto& v : arr) { os << v; if (++i </typename></iostream>…

MacにTORCSを入れるのが難しい

公式で配布しているtorcs.appは微塵も動く気配がないので実体をfileしたらtorcs-bin: Mach-O executable ppcなどと申すので,化石を発掘した気分になった. 依存ライブラリの類はbrewに揃っていないので自前で落としてきてソースからビルドする必要がある. …

template parameter packのN番目の型を取り出すアプローチ

これはメタプロする事自体を目的にした遊びで,実用という意味で考えればO(N)で線形再帰するべき. 線形再帰ならば誰でも読めるし,数十個ぐらいなら最も速い.もし真面目にテンプレート引数を1000個も渡すケースに陥っているならばそれは多分そこに至る時点…

時間を浪費するのやめたい

限界AtoZタイピング #include <iostream> int main() { // Generate applescript std::cout << "on run {input, parameters}\n\tactivate application \"Google Chrome\"" << std::endl; for (char i = 'a'; i <= 'z'; ++i) { std::cout << "\ttell application \"Syst</iostream>…

dlopenやdlsym辺りの実装を読んでそのうちまとめたい

#include <dlfcn.h> #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; if ((fp = fopen("hello.c", "w")) == NULL) { fprintf(stderr, "file cannot open"); exit(EXIT_FAILURE); } fprintf(fp, "#include <stdio.h>\n" "void hello(void) { printf(\"hello dl world!\\n\"); }</stdio.h></stdlib.h></stdio.h></dlfcn.h>…

大量のメモリを使用するプログラムからコマンドを実行する方法というのを読んだ

メモリを多く使用したプロセスから繰り返しfork()する場合,performance issuesになりうるという話. StackOverflow linux - 大量のメモリを使用するプログラムからコマンドを実行する方法 - スタック・オーバーフロー 実際困ることあるらしく 昨日今日ちょ…

github.io

htmlを生成するテンプレートエンジンJade Jade - Template Engine と,cssを生成するStylus Expressive, dynamic, robust CSS — expressive, robust, feature-rich CSS preprocessor の使い方について少し勉強したので,かねてより手を付けたいと思っていたg…

巷で流行りの活動日記

木構造系のデータ構造の実装のベストプラクティスが知りたいと思いつつ,適当に非常に簡単なものを試作するなど. 競プロ用途などで,自分用に簡単なprint機能などを備えた木構造のライブラリなどを作っておきたいという気持ちはある. TSから標準に入るopti…

Tower of Hanoi

#include <iostream> #include <stack> int main() { int n; std::cin >> n; std::stack<int> s[3]; for (int i = n; i > 0; --i) { s[0].push(i); } int mpos = 0; while (!s[0].empty() || !s[1].empty()) { s[(mpos + 1 + (n % 2)) % 3].push(s[mpos].top()); s[mpos].pop(); mp</int></stack></iostream>…

lambda is tuple

理解したのでメモ melpon.org #include <iostream> auto stack = [](auto... xs) { return [=](auto access) { return access(xs...); }; }; auto size = [](auto xs) { return xs([=](auto... z) { return sizeof...(z); }); }; auto push = [](auto xs, auto x) { re</iostream>…

型リストからindex_sequenceを作る

組込のfolding-exprを再帰深度O(1)とみなすと全体でも再帰深度O(1) melpon.org #include <type_traits> #include <utility> template<typename... Types> struct make_indices_from_types { private: template <std::size_t N, std::size_t...> struct make_indices { template <std::size_t M, std::size_t... Indices> make_indices</std::size_t></std::size_t></typename...></utility></type_traits>

printfに型チェックを付ける

どうもコンパイラ拡張で文字列を型パラメータとして取れるユーザ定義リテラルがあるようなので,printfに型チェックを付けるようなのを書いてみた. 桁数表示とか何も実装してないけれど,雰囲気がそれっぽくなってきたあたりで飽きた.もっと賢い実装方法が…

tuple_utility

jaredhoberock/tuple_utility · GitHub tuple_map, tuple_take, tuple_appendなど標準ライブラリに無いtuple操作ユーティリティのライブラリ.NVIDIA製. コードも短く,各操作の実装もシンプルで読みやすい.

tupleの実装解説記事

今年になってからスタートした丁寧なtuple実装解説の連載を見かけたので紹介しておきます. Implementing std::tuple From The Ground Up – Part 1: Introduction and Basic Structure http://blogs.microsoft.co.il/sasha/2015/01/12/implementing-tuple-pa…

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

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…

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)とは有名な 複素平面上の集合、及びそれを複素平面上にプロットしたフラクタル図形の呼称です。 簡単に計算出来、比較的見栄えの…