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

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

CプリプロセッサによるIFの実装

愚直な実装。 #define TRUE 1 #define FALSE 0 #define IF_1(x, y) x #define IF_0(x, y) y #define IF_I(cond, x, y) IF_##cond(x, y) #define IF(cond, x, y) IF_I(cond, x, y) IF(TRUE, hello, world) IF(FALSE, hello, world)

最近良かったもの、気になったものなどメモ書き

1月ももう終わってしまうので今月何したりしたのか私的メモ 最近よかったもの ・Kindle ・Vagrant ・LaTeX ・SoundCloud 最近触り始めたもの ・gnu octave ・PureData ・Docker ・Haskell 気になるもの ・UNIX / Linuxカーネル ・Jenkins ・fluentd ・Chef …