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

boost::mpl を使った再帰処理

mpl::lambda で再帰処理を行うメタ関数を定義してみたいと思います。 今回は再帰処理で、0〜n までの合計を求めてみたいと思います。 通常の関数定義だとこんな感じです。 int sum(int n){ if(0 >= n){ return n; } else{ return n + sum(n-1); } } さて、通…

template で式を書く

C++

template で式を定義し、実行時に展開を行うとかそんな感じです。 説明するよりも見たほうが早いと思うので、まずは使い方を。 // 処理を定義する。_1 は呼び出し時の引数 typedef plus<int_<2>, _1> plus_2_x; int n = plus_2_x()(3); // 2+ 3 を計算して返す BOOST</int_<2>…

構造体のメンバ変数を定数の値で取得したい その2

前回の続きです。 コメントにも頂きましたが、std::mt の年と月のデータは特殊で、そのまま渡しても正しい値として認識がされません。 ですので、変数に渡す場合は、差分を計算して、代入しなければなりません。 std::tm st; st.tm_year = 2010 - 1900; // 1…

boost::mpl を使用した twice の実装

[お題] The lambda Metafunction に書かれている、twice を mpl::lambda や mpl::apply を使用して定義してみる。 // 元のメタ関数 template <class F, class X> struct twice : apply1< typename mpl::lambda<F>::type , typename apply1< typename mpl::lambda<F>::type , X >::typ</f></f></class>…

if 文の遅延処理?

C++

ある値(関数の戻り値等)が true だった場合に呼ばれる関数をあらかじめ設定してしまうとかそんな感じ。 とりあえず、何も考えずに実装してみる。 #include <iostream> #include <boost/function.hpp> #include <boost/fusion/include/vector.hpp> #include <boost/fusion/include/at_c.hpp> namespace fusion = boost::fusion; typedef boost::function<bool()> if_</bool()></boost/fusion/include/at_c.hpp></boost/fusion/include/vector.hpp></boost/function.hpp></iostream>…

構造体のメンバ変数を定数の値で取得したい

C++

関連:Shand.DateTime v1.2 #include <iostream> #include <ctime> #include <boost/assert.hpp> #include <boost/multi_index/member.hpp> #include <boost/mpl/vector.hpp> #include <boost/mpl/at.hpp> #include <boost/mpl/for_each.hpp> namespace multi_index = boost::multi_index; namespace mpl = boost::mpl; typede…</boost/mpl/for_each.hpp></boost/mpl/at.hpp></boost/mpl/vector.hpp></boost/multi_index/member.hpp></boost/assert.hpp></ctime></iostream>

boost::mpl::map から任意の key を持つ pair を抽出

[お題] boost::mpl::map から任意の key を持つ pair を Sequence として抽出したい。 // key が char 型の pair を抽出したい!! mpl::map< mpl::pair<char, int>, mpl::pair<int, float>, mpl::pair<float, char>, mpl::pair<char, float>, mpl::pair<int, int> > #include <boost/mpl/assert.hpp> #include <boost/mpl/equal.hpp> #include </boost/mpl/equal.hpp></boost/mpl/assert.hpp></int,></char,></float,></int,></char,>

boost::mpl::map で、second を抽出

[お題] boost::mpl::map から second の値を Sequence として抽出したい。 #include <boost/type_traits/is_same.hpp> #include <boost/mpl/assert.hpp> #include <boost/mpl/equal.hpp> #include <boost/mpl/map.hpp> #include <boost/mpl/transform_view.hpp> #include <boost/mpl/vector.hpp> #include <boost/mpl/at.hpp> namespace mpl…</boost/mpl/at.hpp></boost/mpl/vector.hpp></boost/mpl/transform_view.hpp></boost/mpl/map.hpp></boost/mpl/equal.hpp></boost/mpl/assert.hpp></boost/type_traits/is_same.hpp>

各 vec 型に対する次元数の取得方法

関連:クラスに持たせる定数について http://d.hatena.ne.jp/gintenlabo/20101214/1292329739 現状の個人的なまとめ。 vec 型の次元数を取得するメタ関数 dimension の実装手段をいくつか。 使い方はこんな感じ。 struct my_vec{ float x, y, z; }; BOOST_ST…

boost::mpl::sort で任意のソート

[お題] boost::mpl::sort を任意の値でソートしたい #include <boost/mpl/vector.hpp> #include <boost/mpl/sort.hpp> #include <boost/mpl/equal.hpp> #include <boost/mpl/reverse.hpp> #include <boost/mpl/greater.hpp> namespace mpl = boost::mpl; typedef mpl::vector<float, double, char, int> source; typedef mpl::vector</float,></boost/mpl/greater.hpp></boost/mpl/reverse.hpp></boost/mpl/equal.hpp></boost/mpl/sort.hpp></boost/mpl/vector.hpp>

エラー処理のメモ

C++

[例外] std::vector<T>::at(n); [assert] std::vector<T>::operator [n]; pstade::oven::at(n);</t></t>

定数の定義

C++

boost::fusion を使っててふと思ったんですが。 typedef std::size_t dimension_type; struct my_vec{ static const dimension_type dimension = 3; float x, y, z; }; BOOST_STATIC_ASSERT( my_vec::dimension == 3 ); こうやって定義するよりも……。 templa…

one-phase construction

C++

書くネタが無いので、他の記事に便乗するでゲソ! 関連:One-Phase Construction 入門 〜 Constructor run once つまりこういうことでゲソか? #include <boost/noncopyable.hpp> struct vec : public boost::noncopyable{ vec() : x(0.0f), y(0.0f), z(0.0f){} vec(float _x, float</boost/noncopyable.hpp>…

定数の has_xxx

C++

template<int N> struct sfinae_helper{ typedef void type; }; template<typename T, typename U = void> struct has_dimension_impl{ static const bool value = false; }; template<typename T> struct has_dimension_impl<T, typename sfinae_helper<T::dimension>::type>{ static const bool value = true; }; templat…</t,></typename></typename></int>

お詫び

先日、知り合いと Twitter でやり取りをしていて初めて知ったのですが…… フォローしてないとリプライされてもタイムラインに表示されないんですねいやーてっきり表示されるとばかり思っていました。 今までわたしにリプライされた方がいたら気づかなくてすみ…

新規ファイル作成時に使用するテンプレートファイルを指定して作成

auto-insert では、ファイル名(拡張子等)以外で使用するテンプレートファイルの切り替えが出来なかったので、ちょっと改造してみました。 元となった elisp はこちらです。 http://www.02.246.ne.jp/~torutk/cxx/emacs/mode_extension.html [before] ;; 〜…

新規ファイルのテンプレート

VisualStudio で新規ファイルのテンプレートをつくろうと思ったのですが VC には作成する機能が無いみたいです。 (正確にいえばエクスポートが出来ないみたい) しょうがないので、VisualStudio の外部ツールで Emacs を呼び出して、autoinsert の機能を使…

BOOST_ASSERT(expr)

#include <boost/assert.hpp> int main(){ BOOST_ASSERT(false); int* ptr = NULL; BOOST_ASSERT(ptr != NULL); return 0; } 内部で assert を呼んでいるだけなので、使い方は通常の assert と同じです。 拡張機能として、BOOST_ASSERT の処理をフックすることが出来ます。 #in</boost/assert.hpp>…

boost 1.45.0 のコンパイル

公式から落としてきた bjam で boost 1.45.0 をコンパイルしようとすると失敗するみたいです。 bootstrap.bat から生成した bjam だと問題なくコンパイルが出来ます。 よく見てみると bjam のバージョンが食い違ってるみたいですね。 公式からダウンロード …

boost 1.45.0

boost 1.45.0 がリリースされたみたいです。 リリースノート:http://www.boost.org/users/news/version_1_45_0 日本語版 :https://sites.google.com/site/boostjp/document/version/1_45_0 個人的に気になった部分はあまりないかな?

boost::parameter を class template で使う

#include <map> #include <string> #include <boost/parameter.hpp> #include <boost/static_assert.hpp> #include <boost/type_traits/is_same.hpp> BOOST_PARAMETER_TEMPLATE_KEYWORD(key) BOOST_PARAMETER_TEMPLATE_KEYWORD(value) BOOST_PARAMETER_TEMPLATE_KEYWORD(compare) BOOST_PARAMETER_TEMPLATE_KEYWORD(allocat…</boost/type_traits/is_same.hpp></boost/static_assert.hpp></boost/parameter.hpp></string></map>

boost::parameter

#include <boost/parameter.hpp> #include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple_comparison.hpp> #include <boost/assert.hpp> typedef boost::tuple<int, int> pos_t; BOOST_PARAMETER_NAME(x) BOOST_PARAMETER_NAME(y) template<typename Args> pos_t make_pos(const Args& args){ return pos_t(args[_x…</typename></int,></boost/assert.hpp></boost/tuple/tuple_comparison.hpp></boost/tuple/tuple.hpp></boost/parameter.hpp>

C++0x の右辺値参照がこんなに難しいわけがない。

C++0xのアレです。 これに関してはさんざん解説がされているとは思いますが、自分がイマイチ理解していなかったのでまとめてみました。 概念や細かい仕様なんかは書いてないのでありからず…。 あとテスト用のコンパイラは、gcc-4.5.0 です。 ☆参照渡し C++ …

ドキュメントの作成

テキストファイル 編集や管理が簡単だがダサい word 使い勝手が悪い html エディタを使って、html を書いたことがないのでなんともいえない Github や Assemble に付いている wiki を使用する 編集や管理は楽そう ただし、ローカルで保存できないので、ライ…

boost::test

#include <boost/test/minimal.hpp> bool is_leap_year(int year){ return year%4 == 0 && year%100 != 0 || year%400 == 0; } template<typename T, typename U> struct is_same{ static const bool value = false; }; template<typename T> struct is_same<T, T>{ static const bool value = true; }; int test_main(int …</t,></typename></typename></boost/test/minimal.hpp>

ライブラリ構成のメモ書き

以前作成していた vec ライブラリをつくり直す改良するのにしたがって、ライブラリの構成も大幅に変えようと思うので、そのメモ書き。 大まかな作りは、boost や pstade なんか参考にする予定。 覚え書き バージョン管理 使用するのは自分ひとり(予定) テ…

template クラスの SFINAE

C++

template< typename T, typename U = void > struct has_value_type{ static const bool value = false; }; template<typename T> struct has_value_type<T, typename T::value_type>{ static const bool value = true; }; 最初はこんな感じでやろうとしたんですが、これだとうまく行きませんでした</t,></typename>…

複数条件での SFINAE

C++

template<typename T> void func(typename boost::disable_if<boost::is_pod<T> >::type* = 0){ std::cout << "is no POD" << std::endl; } template<typename T> void func(typename boost::enable_if<boost::is_pod<T> >::type* = 0){ std::cout << "is POD" << std::endl; } func(10); // is POD func("test"); // is</boost::is_pod<t></typename></boost::is_pod<t></typename>…

ベクトルの要素へのアクセス 〜その5〜

[ベクトル型の例] boost::array<float, 3> array_vec; std::valarray<float> valarray_vec; struct my_vec{ float x, y, z; }; 0.各アクセッサを使用するために最低限必要な実装 x, y, z の要素の型を取得すために vec_value の特殊化を行います。 [使用例] my_vec vec; vec_</float></float,>…

ベクトルの要素へのアクセス 〜その4〜

まとめ イテレータによるアクセス iterator を使用して、イテレーティブにアクセスを行う インデックスによるアクセスと、要素への直接アクセスも使用できる インデックスでアクセス インデックスを使用して、配列の様にアクセスを行う 要素への直接アクセス…