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

インスタンスメンバを利用したポリシー

C++テンプレートテクニック 6-4 前回の記事ではstaticメンバ関数を使用したポリシークラスの実装になっていました。今回はインスタンスメンバを使用した場合のポリシーについてです。 #include <iostream> using std::cout; using std::endl; template<class Policy> class CClass { </class></iostream>…

ポリシー

C++テンプレートテクニック 6-1 またしても新しい単語が登場。ポリシー。要約すると同じ関数を持つ別々のクラスを指定できるようにするテンプレートといった感じでしょうか。 #include <iostream> using std::cout; using std::endl; template<class T> void func () { T::foo()</class></iostream>…

SFINAE

C++テンプレートテクニック 5-1 SFINAEという言葉が出てきました。テンプレートのインスタンス化に失敗した場合に、即エラーにするわけではなく、一旦オーバーロードの候補から外して別のテンプレートをインスタンス化する、という感じですかね。前回の記事…

劣化版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>…

テンプレート・テンプレート・パラメータ

C++テンプレートテクニック 2-8 template<class T> class CClass { T<int> m_x; }; $ cl /W4 /EHsc main.cpp Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. main.cpp main.</int></class>…

template限定子

C++テンプレートテクニック 2-6 template<class T> int foo(T x,int n) { return x.get<3>(n); } 上記のようなテンプレートの場合、「x.get(n)」は変数xのgetメンバ関数の呼び出しを期待しているわけなのだが、変数xのgetメンバ変数と3を比較するという処理、つまり「</class>…

typenameキーワード

C++テンプレートテクニック 2-6 テンプレートの曖昧さ回避のために使用するらしい。 #include <iostream> using std::cout; using std::endl; struct ClassA { typedef int result; }; struct ClassB { static const int result = 5; }; int p; template<class T> void func (T)</class></iostream>…

コンストラクタテンプレート

C++テンプレートテクニック 2-5 コンストラクタテンプレートという名前がついてますが、要はクラステンプレートとメンバ関数テンプレートの合わせ技ですね。 関連 http://d.hatena.ne.jp/pknight/20090805/1249471903

テンプレート引数にポインタを渡す

C++テンプレートテクニック 2-4 テンプレート引数にはコンパイル時に値が確定しているグローバル変数や関数のポインタも渡すことができます。 #include <iostream> using std::cout; using std::endl; template<class T,void (T::*M)()> void func (T obj) { (obj.*M)(); } class CClass { publ</class></iostream>…

テンプレートと参照渡しを利用して配列の要素数を取得する

C++テンプレートテクニック 2-4 #include <iostream> using std::cout; using std::endl; template<class T,int N> int size(T (&)[N]) { return N; } int main () { int a[] = {3,4,5,6}; // 配列aの要素数を表示 cout << size(a) << endl; return 0; } $ main 4配列の参照渡しをした</class></iostream>…

配列のポインタ渡しと参照渡しの違い

C++

ポインタ渡しとは以下のような処理です。 #include <iostream> using std::cout; using std::endl; // ポインタ渡し void func(int *a) { cout << a[0] << endl; } int main () { int a[] = {3,4,5,6}; func(a); } また、以下のようにも書くことができます。 void func</iostream>…

明示的なインスタンス化の注意点

C++テンプレートテクニック 2-2 さて、以下のコードはコンパイルできるでしょうか? #include <iostream> using std::cout; using std::endl; template<class T> class CClass { public: T m_val; CClass (T val) { m_val = val; } void Set (T val) { m_val = val; } T Get () </class></iostream>…

マクロによるテンプレートもどき

C++テンプレートテクニック 1-2 お次はマクロを利用してテンプレートっぽいことをやるという話。ということで前回の記事で作ったreverseをマクロテンプレートもどきで再実装してみた。 #include <iostream> #define ARRAY_NUM(a) (sizeof(a)/sizeof(a[0])) using std::</iostream>…

あらゆる型をObjectクラスから派生する

C++テンプレートテクニック 1-1 テンプレートが無かった時代に考案されたObjectクラスから派生する方法。これはこれでなかなか面白い。うまく考えれば用途はありそうな気はする。

C++テンプレートテクニック購入

C++テンプレートテクニック作者: επιστημη,高橋晶出版社/メーカー: ソフトバンククリエイティブ発売日: 2009/04/25メディア: 単行本購入: 16人 クリック: 224回この商品を含むブログ (54件) を見る 欲しかった本。ついに購入しました。ゆっくり読み進めてい…

ループを使わずに配列の順序を逆にする

C++

プログラマーの力量を見極める--面接官になったら尋ねるべき質問実例集 - ZDNet Japan ループを使わずに配列の順序を逆にする。 という件があったのでチャレンジしてみた。 #include <iostream> #define ARRAY_NUM(a) (sizeof(a)/sizeof(a[0])) using std::cout; using</iostream>…

練習用その2 アフィン変換に対応した2×2(実際は3×3)行列クラス

前回を踏まえて新しく実装。大分マシになってきた。 #include <cmath> #include "vector2.h" // アフィン変換に対応した2×2(実際は3×3)行列クラス namespace ddp { static const float PI = 6*static_cast<float>(asin( 0.5 )); class Matrix2 { private: public: float </float></cmath>…

練習用行列クラス アフィン変換

変換の行列表現 | Microsoft Docs回転、スケーリングの線形変換の後に、平行移動をすることをアフィン変換というらしい。この内容を踏まえた上で行列クラスについて考えることにする。

まずは練習用に2×2の行列クラス

行列クラスを自分で作ってみる。まずは前提知識無しで作った最初のバージョンを公開 #include "vector2.h" namespace ddp { class Matrix2 { public: Vector2 v1; Vector2 v2; Matrix2(Vector2 v1,Vector2 v2) { this->v1 = v1; this->v2 = v2; } // ベクト…

ベクトルクラス

C++

ゲーム3D数学本を参考にベクトルクラスの作成。とりあえず2Dプログラム用なのでVector2とした。 #include <math.h> namespace ddp { class Vector2 { public: // 点。隠蔽する必要性が無いのでpublicで提供 float x; float y; // コンストラクタ。明示的な初期化は行</math.h>…

switch文のcaseでのブロック

C C++

switch文のcaseの中で変数宣言する場合は注意が必要です。 #include <iostream> using std::cout; using std::endl; int main () { switch(1) { case 1: int i = 0; break; case 2: int i = 0; break; } return 0; } $ cl /W4 /EHsc main.cpp Microsoft(R) 32-bit C/C+</iostream>…

A-starアルゴリズム

人材獲得作戦・4 試験問題ほか: 人生を書き換える者すらいた。この問題をC言語の勉強がてらやってみました。幅優先探索とか色々方法はあるみたいですが、A-starなんてアルゴリズムがあるらしく、折角なので調べながらやってみました。A* - Wikipedia #inclu…

上下左右をループで得るコード

C++

今日見たコードで凄いのがあった。 #include <iostream> using std::cout; using std::endl; int main () { for (int x = -1, y = 0, i = 0; i < 4; x += y, y = x - y, x = y - x, ++i) { cout << "x " << x << " y " << y << endl; } return 0; } $ main x -1 y 0 x </iostream>…