2011-04-01から1ヶ月間の記事一覧
※長いです。 #include <boost/mpl/bool.hpp> #include <boost/mpl/assert.hpp> namespace mpl = boost::mpl; struct _{}; template<typename T> struct quote{}; template< template <typename> class T > struct quote1 : T<_>{ typedef T<_> type; }; template< template <typename, typename> class T > struct quote2 : T</typename,></_></_></typename></typename></boost/mpl/assert.hpp></boost/mpl/bool.hpp>
Boost.Bind だと、Bind 時に戻り値型を決定する必要があります。 ですので、引数型で戻り値型を決定することが出来ません。 引数型で戻り値型を決定する場合は、Boost.Lambda.Bind を使用すれば解決します。 #include <boost/lambda/bind.hpp> #include <boost/lambda/lambda.hpp> #include <boost/bind.hpp> #include <boost/typeof/typeof.hpp> #inclu</boost/typeof/typeof.hpp></boost/bind.hpp></boost/lambda/lambda.hpp></boost/lambda/bind.hpp>…
元ネタ:ボレロ村上 - ENiyGmaA Code - enable_switch - 複数の重複しうるコンパイル時条件で、SFINAE によるオーバーロードを書くには SFINAE を使用する上で、この機能は欲しかったので自分も書いてみました。 二番煎じ乙。 #include <boost/utility/enable_if.hpp> #include <boost/mpl/apply.hpp> #include <boost/mpl/and.hpp></boost/mpl/and.hpp></boost/mpl/apply.hpp></boost/utility/enable_if.hpp>…
Boost.Initialized といいつつ、ほぼオレオレ Initialized になっていますが……。 Boost.Initialized は初期化のみで、初期値を設定することが出来ないので出来るようにしてみました。 基本的な動作は、Boost.Initialized と同じです。 [サンプルソース] #inc…
本当は動画で紹介した方が分かりやすいんですが、めんどくさかったので割愛。 現在 vim でコーディングしている時に使用してる主なプラグインの紹介です。 ざっくりとした事しか書いていないので、気になる方はググッてくださいねっ!キラッ★ ★neocomplcache…
#include <boost/mpl/divides.hpp> #include <boost/mpl/int.hpp> #include <iostream> namespace mpl = boost::mpl; template<typename T1, typename T2> struct divides : mpl::divides<T1, T2>{ template<typename T> operator T() const{ return static_cast<T>(T1::value) / static_cast<T>(T2::value); } }; typedef …</t></t></typename></t1,></typename></iostream></boost/mpl/int.hpp></boost/mpl/divides.hpp>
まぁ使っている人は当然知ってるとは思いますが。 VisualStudio 2010 だとソースコード上のメタ関数の結果をマウスオーバーでポップアップ表示してくれたりします。 実行どころか、コンパイルすらいりません。 以前、メタメタなコードを書いているときはかな…
パッと見なかったので書いてみた。 #include <boost/mpl/vector.hpp> #include <boost/mpl/begin.hpp> #include <boost/mpl/iterator_range.hpp> #include <boost/mpl/int.hpp> #include <boost/mpl/advance.hpp> namespace mpl = boost::mpl; template<typename Seq, typename N, typename M> struct slice : mpl::iterator_range< typenam…</typename></boost/mpl/advance.hpp></boost/mpl/int.hpp></boost/mpl/iterator_range.hpp></boost/mpl/begin.hpp></boost/mpl/vector.hpp>
タイトルがすごくピンポイントですが……。 boost::for_each で std::map を捜査する際に、first や second のみ抽出したい! みたいな処理が Boost.Lambda で比較的、簡単に書くことが出来ました。 #include <boost/range/algorithm/for_each.hpp> #include <boost/lambda/lambda.hpp> #include <boost/assign.hpp> #include <iostream> #include <map> typede</map></iostream></boost/assign.hpp></boost/lambda/lambda.hpp></boost/range/algorithm/for_each.hpp>…
前回:http://d.hatena.ne.jp/osyo-manga/20110330/1301433540 http://d.hatena.ne.jp/osyo-manga/20110413/1302712181 #include <boost/utility/enable_if.hpp> #include <boost/mpl/vector.hpp> #include <boost/mpl/switch.hpp> #include <boost/mpl/push_back.hpp> namespace boost { namespace mpl { namespace detail{ t…</boost/mpl/push_back.hpp></boost/mpl/switch.hpp></boost/mpl/vector.hpp></boost/utility/enable_if.hpp>
改良しました。 前回:http://d.hatena.ne.jp/osyo-manga/20110329/1301361828 ☆使い方 switch_(値) |=case_(条件)|(式) // | 演算子で式を設定 |=case_(条件) // (式)がない場合は、fall through |=case_(条件)&(値) // & 演算子で評価を行わずに、値をその…
と、いっても殆ど Boost.Fusion 回りの実装で時間を食ってしまいましたが。 Variadic Templates に対応した Boost.MPL Sequence が欲しかったので書いてみました。 ついでに Boost.Fusion も。 #include <boost/mpl/vector.hpp> #include <boost/mpl/apply.hpp> #include <boost/mpl/push_front.hpp> namespace mpl = boost::mpl; n</boost/mpl/push_front.hpp></boost/mpl/apply.hpp></boost/mpl/vector.hpp>…
#include <boost/variant.hpp> #include <boost/mpl/equal.hpp> #include <boost/mpl/equal_to.hpp> #include <boost/mpl/assert.hpp> #include <boost/mpl/size.hpp> #include <boost/mpl/vector.hpp> #include <boost/mpl/int.hpp> #include <boost/mpl/back.hpp> #include <boost/mpl/copy.hpp> #include <string> names…</string></boost/mpl/copy.hpp></boost/mpl/back.hpp></boost/mpl/int.hpp></boost/mpl/vector.hpp></boost/mpl/size.hpp></boost/mpl/assert.hpp></boost/mpl/equal_to.hpp></boost/mpl/equal.hpp></boost/variant.hpp>
非同期で、1〜20 までの合計を計算します。 #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/thread.hpp> boost::mutex mutex; int sum = 0; void add(int n){ boost::mutex::scoped_lock lock(mutex); sum += n; std::cout << n << ":" << sum << std::endl; }; int main(){ n</boost/thread.hpp></boost/bind.hpp></boost/asio.hpp></iostream>…
こんな事が出来たんですね。 #include <boost/bind.hpp> #include <boost/function.hpp> #include <iostream> int double_(int n){ return n + n; } void disp(int n){ std::cout << n << ","; } int main(){ boost::function<void(int)> f = boost::bind(disp, boost::bind(double_, _1)); for(int i = 0 ; i < 10 ; +</void(int)></iostream></boost/function.hpp></boost/bind.hpp>…
ソースの文字コードに痛く悩まされたので覚え書き。 2バイト文字が含まれているソースコードを各コンパイラで試してみました。 とりあえず、コンパイルオプションとかなしの状態で。 ☆コンパイラ msvc2010(cl.exe から直接コンパイル) gcc 4.5.2 (MinGW) c…
msvc で、/Za(言語拡張機能の無効化)オプションを付けてコンパイルすると次のコードはエラーになります。 template<typename t> struct hoge{ typedef t type; }; template<typename t> struct foo : hoge<t>{ typedef typename foo<t>::type type; // ここら辺でエラー }; typedef foo<int>::ty</int></t></t></typename></typename>…
range concept でエラー Windows.h をインクルードするとエラー ← new BOOST_WINDOWS が定義されない ← new boost/asio.hpp をインクルードすると netdb.h がないと怒られる ← new もう原因を探るのも疲れました……。 そんな訳で、msvc の言語拡張を /Za オプ…
次のコードはエラーになります。 // placeholders を mpl::vector で使用する typedef mpl::lambda<mpl::vector<_1, _2, _3> >::type triple; typedef triple::apply<triple, int, int, int>::type int_int_int; // mpl::equal を使用する(placeholders を使用したデフォルト引数が原因?) typedef mpl::la</triple,></mpl::vector<_1,>…
boost.variant を使用すれば、簡単にエミュレート出来ました。 #include <iostream> #include <string> #include <utility> #include <boost/variant.hpp> typedef boost::variant<int, std::string, std::pair<int, std::string> > var_type; var_type func(int n){ switch(n){ case 0: return std::string("string"); case 1: return 10; defaul…</int,></boost/variant.hpp></utility></string></iostream>
最近、TL が 3D で溢れているので、久々に昔のソースコードを引っ張り出して遊んでいました。 とりあえず、未完成だった OpenGL のボーンアニメーションを実装とかしていました。 うーむ、久々にクリーチャーなんかを製造して楽しかったです。 これで、1箇所…