2010-03-19から1日間の記事一覧

劣化版iterator_traitsを実装してみる

前々回の記事で型変換について学習したのでVector等も渡せる配列操作関数を作成する - (void*)Pないとで出てきたiterator_traitsを実装してみる。 #include <iostream> #include <vector> using std::cout; using std::endl; template<class T> struct types { typedef typename T::valu</class></vector></iostream>…

高階メタ関数

C++テンプレートテクニック 4-6 ここは自分なりのサンプルが全然思いつかなかった。とりあえずまったく意味のないシンプルなコードだけ書いてみた。 #include <iostream> using std::cout; using std::endl; template<class T> struct bar { static const bool value = T::value</class></iostream>…

メタ関数で型を変換する

C++テンプレートテクニック 4-3 テンプレートメタプログラミング - (void*)Pないとの続きです。今度は型を変換するメタ関数の登場です。 #include <iostream> using std::cout; using std::endl; template<class T> struct types { typedef T type; }; int main () { types<int>::typ</int></class></iostream>…

テンプレートメタプログラミング

C++テンプレートテクニック 4-1、4-2 テンプレートのインスタンス化を利用して、コンパイル時にプログラミングをすることをテンプレートメタプログラミングという。 #include <iostream> using std::cout; using std::endl; template<int N> class CClass { public: static co</int></iostream>…

パラメータ化継承

C++テンプレートテクニック 3-6 単に基底クラス名をテンプレート指定するという話ですが template<class T> class Foo : public T { } 何か色々できそうな気はするのですが、具体的な利用法が思い浮かばないですね。</class>

タグ・ディスパッチ

C++テンプレートテクニック 3-5 簡単に言えばオーバーロードを利用した関数の呼び分け処理といった感じでしょうか。シンプルな例を考えてみました。 #include <iostream> using std::cout; using std::endl; // ディスパッチ用のタグ名 struct tag_a {}; struct tag_b </iostream>…

Vector等も渡せる配列操作関数を作成する

C++テンプレートテクニック 3-3 とりあえず例としてfindを作ってみます。 #include <iostream> using std::cout; using std::endl; template<class T> T* myfind (T* first,T* last, T value) { T* p=first; for (; p != last; ++p) { if ( *p == value ) { break; } } return p</class></iostream>…