2012-02-01から1ヶ月間の記事一覧

関数のデフォルト引数に lambda expressions を渡す

C++

ふと出来るのかと思って試してみました。 [ソース] #include <type_traits> #include <iostream> template<typename T> struct identity{ using type = T; }; template< typename T > void disp( std::initializer_list<T> list, typename identity<void(*)(T)>::type func = [](T n){ std::cout << n << std::e</void(*)(t)></t></typename></iostream></type_traits>…

static_assert を遅延処理(ボツネタ)

C++

件の仕様に気づく前に書いていたネタ。 static_assert を遅延処理したりします。 [ソース] #include <type_traits> #include <utility> #include <tuple> template<typename T> using decay = typename std::decay<T>::type; template<typename T> constexpr typename std::add_rvalue_reference<T>::type forward(typena</t></typename></t></typename></tuple></utility></type_traits>…

clang 3.1(trunk) に Initializer lists が実装された

[C++11 Implementation status] [ソース] #include <vector> #include <iostream> template<typename T> void disp(std::initializer_list<T> list){ for(auto&& n : list){ std::cout << n << std::endl; } } struct X{ X() : elems{1, 2, 3}{} int elems[3]; }; int main(){ std::vector<int> v =</int></t></typename></iostream></vector>…

clang 3.1(trunk) に Lambda expressions と Extending sizeof が実装された

ヒャッハー! [C++11 Implementation status] [ソース] #include <cassert> #include <algorithm> #include <iostream> struct X{ int value; }; int main(){ // Lambda expressions int v[] = { 1, 2, 3, 4, 5 }; int sum = 0; std::for_each(v, v+5, [&](int n){ std::cout << n << ", ";</iostream></algorithm></cassert>…

コンパイル時乱数の生成

と、いうものは Sprout にも実装されているんですが、ちょっと自分でも書いてみました。 まぁちと怪しいですが。 [ソース] #include <utility> #include <iterator> struct random{ using seed_type = std::size_t; constexpr random() : seed(2531011L){} constexpr random(see</iterator></utility>…

Boost 1.49.0 がリリース

Boost 1.49.0 がリリースされました。 Version 1.49.0 リリースノート(日本語版) 個人的に特に目新しい物はないかな? Boost.TTI はいつリリースされるんだろう。 あと Boost とは関係ないですが VC++11 Beta が 2/29 にリリース予定みたいですね。 C++11 …

そんなものはなかった

C++

最近ちょくちょく使っていた戻り値型を省略して lambda expression 内にローカルクラスを戻り値型にする方法は gcc や clang の独自拡張だったんですね…。 正確にいえば、戻り値型を省略する場合は、return 文1文だけしか記述することができないみたいです。…

Vim script で乱数の生成

下記のサイトに Vim script で乱数を生成する方法が載っているのですが、それを元にして C++っぽい生成器を書いてみました。 元ネタ:Vimでゲームを作るためのtips - mfumiの日記 [ソース] function! s:srand(seed) let self = {} let self.seed = a:seed fu…

C++ で整形して Range の出力

C++

横に出力するものはたまに見ますが、縦にインデントを整形して出力するのはあんまり見たことがなかったのでちょっと書いてみました。 std::begin() と std::end() が使用できる Range なら問題ないかな? あと値が operator オーバーロードしていれば。 [ソ…

マクロ関数の引数内でカンマを使用する

C++

下記のようにマクロ関数内でテンプレート等を書く場合にカンマを使用すると、式が評価される前に引数として扱われるのでエラーになります。 #define STATIC_ASSERT(expr) static_assert(expr, #expr) // error: too many arguments provided to function-lik…

Sprout の SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION

元々 Sprout を gcc 4.7 で使用する場合に #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION をユーザ側で定義しないとコンパイルがされないコード(一時オブジェクトを algorithm で使用する場合等)があったんですが、いつの間にかユーザ側で…

lambda expression でスコープ内の constexpr を参照する

C++

こんな事が許されるんですね…。 [ソース] template<typename T> void static_assert_(T){ static_assert(T()(), ""); } int main(){ constexpr int num = 10; auto x = []{ struct X{ constexpr int operator ()() const{ return num; } }; return X{}; }(); static_asse</typename>…

clang 3.1(trunk) で lambda expression がコンパイルできた

先日 constexpr のために trunk から clang のソースコードを落としてきてビルドしたんですが、lambda expression のコードもコンパイルする事が出来ました。 ひとまず、下記の様なコードだと問題ないなかったです。 [ソース] #include <vector> #include <algorithm> #include <iostream></iostream></algorithm></vector>…

関数内で constexpr の場合のみ static_assert する

C++

さて、constexpr を使っていると次のように関数内で static_assert を行いたい場合があると思います。 template<typename T> void check(T t){ // t を参照して static_assert にしたい static_assert(t % 2 == 0, ""); } constexpr int a = 2; check(x); // error: 't' </typename>…

unite-edit-global-variables つくった

vim

unite-edit-global-variables という unite-source をつくりました。 以前も unite-checking-global-variables という似たような unite-source をつくったんですが、今回は全てのグローバル変数をコマンドで編集できるようにしてみました。 [Vimプラグイン] …

clang に constexpr が実装された

C++

[C++11 Implementation status] [適当なテスト] constexpr int plus(int a, int b){ return a + b; } constexpr int power(int x, int n){ return n == 1 ? x : x * power(x, n-1); } struct X{ constexpr X(int value) : value(value){} constexpr bool ope…

関数の戻り値が constexpr かどうかを判定する

C++

そんな感じの constexpr 関数を書いてみました。 まさに誰得。 [ソース] #include <type_traits> template<typename T> constexpr bool true_(T){ return true; } template<typename T, typename ...Args, bool = true_(T{}(Args{}...))> constexpr bool is_constexpr_impl(bool&&){ return true; } template<typename T, typename ...Args> constexpr…</typename></typename></typename></type_traits>

unite-file_mru で時間の表示幅を合わせる

vim

unite-file_mru で出力される時間ですが、デフォルト値だと時間によって幅が違ってしまっているので、同じ幅になるように設定しました。 " file_mru let g:unite_source_file_mru_time_format = "(%Y/%m/%d %H:%M:%S) " " directory_mru let g:unite_source_…

reanimate.vim というプラグインをつくった

vim

さて、今日はチョコの日ということで unite-valentine でもつくろうかと思ったんですが、アニメーションの実装がしんどかったので断念しました。 その代わりといってはなんですが、以前からつくっていた Vim の復元プラグインでもネタにしたいと思います。 …

Variadic Templates を展開して関数を評価する

元ネタ:variadic templateメモ - bigsleepの日記 戻り値型が void の場合はこんな感じかしら。 [ソース] #include <iostream> #include <initializer_list> template<typename T> void expand(std::initializer_list<T>){} template<typename T> void disp_impl(T t){ std::cout << t << std::endl; } template<typename ...Args> void</typename></typename></t></typename></initializer_list></iostream>…

Sprout.Weed でセマンティックアクション

的ななにか。 Boost.Spirit.Qi とはちと挙動が違うと思いますが、あったらあったで便利そうな感じがします。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> #include <sprout/string/alias.hpp> template<typename T> using decay = typename std::decay<T>::type</t></typename></sprout/string/alias.hpp></sprout/weed.hpp>…

C++11 で enable_if を書いてみる

C++er は C++11 で書くことを強いられているんだ!!(集中線 ってことで C++03 の enable_if を使ったコードを C++11 で書きなおしてみたいと思います。 べ、べつにぼっち Boost.勉強会じゃないんだからねっ! まだ C++11 のコードは手探りで書いているので…

Sprout.Weed で n 文字数に一致するパーサ

repeat を使用します。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> #include <iostream> template<typename Parsed> struct parsed_holder{ constexpr operator bool() const{ return parsed.success(); } template<typename T> constexpr bool operator ==(T</typename></typename></iostream></sprout/weed.hpp>…

Sprout.Weed を使ってコンパイル時に shader をパース

元々これがやりたくてコンパイル時パーサが欲しかったんですが、今のレベルでどれほどのものなのか試してみました。 Shader はここの example から拝借 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> template<typename Parsed> struct pa</typename></sprout/weed.hpp>…

Sprout.Weed の lim に渡す category の違い

以前もチラッと書いたのですが、もうちょっと分かりやすい違いをコードで書いてみました。 知っておいて損はないかな? [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> template<typename Parsed> struct parsed_holder{ constexpr operato</typename></sprout/weed.hpp>…

Sprout.Weed でコンパイル時にファイルパスをパース

やってみました。 __FILE__ とかがコンパイル時にパースできますね。 果たして必要になるときが来るのだろか…。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> #include <sprout/tuple/array.hpp> #include <iostream> template<typename Parsed> struct parsed_holder{ cons</typename></iostream></sprout/tuple/array.hpp></sprout/weed.hpp>…

Sprout.Weed で使って複数の文字列パースする

例えがちょっと分かりづらいんですが、文字列を複数読み込む場合に戻り値型がちょっと複雑だったので覚書。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> #include <sprout/string/alias.hpp> int main(){ namespace w = sprout::weed; static co</sprout/string/alias.hpp></sprout/weed.hpp>…

ctags と neocomplcache と unite-tag を使って関数定義箇所を開く

ちと今まで敬遠しがちだった ctags を真面目に使ってみました。 neocomplcahce と unite-tag を利用します。 ほとんど処理が neocomplcache と unite-tag で完結しているので実際はそんなに難しくなかったですね。 [Vimプラグイン] neocomplcache - github u…

Sprout.Weed でアンダーバー区切りの2進数をパースをちょっと改良

前回はアンダーバーを取り除いただけでしたが、今回は、 4桁区切りで読み込む prefix を定義 「_」,「.」,「,」 のどれかで区切れる という感じに改良してみました。 [ソース] #define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> templ</sprout/weed.hpp>…

clang_complete を更新したら補完速度が遅くなった

clang_complete を更新したら補完速度が遅くなったので原因を調べてみたらデバッグ時に行なっているこいつが原因でした。 [回避方法] clang_complete のデバッグ機能をオフにします。 let g:clang_debug=0 補完時間を出力しないのであればこれで問題ありませ…