2011-04-01から1ヶ月間の記事一覧

template class を受け取る is_same メタ関数

※長いです。 #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.Lambda.Bind 時に引数型で戻り値型を決定する

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

複数条件での enable_if

元ネタ:ボレロ村上 - 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 で、宣言時に初期値を設定する

Boost.Initialized といいつつ、ほぼオレオレ Initialized になっていますが……。 Boost.Initialized は初期化のみで、初期値を設定することが出来ないので出来るようにしてみました。 基本的な動作は、Boost.Initialized と同じです。 [サンプルソース] #inc…

使用している vim プラグインまとめ

本当は動画で紹介した方が分かりやすいんですが、めんどくさかったので割愛。 現在 vim でコーディングしている時に使用してる主なプラグインの紹介です。 ざっくりとした事しか書いていないので、気になる方はググッてくださいねっ!キラッ★ ★neocomplcache…

Boost.MPL の divides を実行時に計算

#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 の機能

まぁ使っている人は当然知ってるとは思いますが。 VisualStudio 2010 だとソースコード上のメタ関数の結果をマウスオーバーでポップアップ表示してくれたりします。 実行どころか、コンパイルすらいりません。 以前、メタメタなコードを書いているときはかな…

MPL Sequence を slice

パッと見なかったので書いてみた。 #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 の second や first を抽出

タイトルがすごくピンポイントですが……。 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>…

Variadic Templates 版 mpl::switch_

前回: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>

オレオレ switch case 改良したよー

改良しました。 前回:http://d.hatena.ne.jp/osyo-manga/20110329/1301361828 ☆使い方 switch_(値) |=case_(条件)|(式) // | 演算子で式を設定 |=case_(条件) // (式)がない場合は、fall through |=case_(条件)&(値) // & 演算子で評価を行わずに、値をその…

Variadic Templates で遊んでみた

と、いっても殆ど 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>…

Boost.Variant で Sequence を扱う

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

Boost.Asio で非同期処理

非同期で、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>…

boost::bind 内に boost::bind

こんな事が出来たんですね。 #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>…

ソースの文字コード

C++

ソースの文字コードに痛く悩まされたので覚え書き。 2バイト文字が含まれているソースコードを各コンパイラで試してみました。 とりあえず、コンパイルオプションとかなしの状態で。 ☆コンパイラ msvc2010(cl.exe から直接コンパイル) gcc 4.5.2 (MinGW) c…

msvc の /Za オプションでエラー

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

msvc の /Za オプションの弊害

range concept でエラー Windows.h をインクルードするとエラー ← new BOOST_WINDOWS が定義されない ← new boost/asio.hpp をインクルードすると netdb.h がないと怒られる ← new もう原因を探るのも疲れました……。 そんな訳で、msvc の言語拡張を /Za オプ…

mpl::lambda の注意点

次のコードはエラーになります。 // 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>

OpenGL と DirectX の違い

最近、TL が 3D で溢れているので、久々に昔のソースコードを引っ張り出して遊んでいました。 とりあえず、未完成だった OpenGL のボーンアニメーションを実装とかしていました。 うーむ、久々にクリーチャーなんかを製造して楽しかったです。 これで、1箇所…