C++

Template Meta-Programing 初歩 その2 : 型の切り替え

C++

template < bool bln, typename Type1, Typename Type2 > struct Std { typedef Type1 Type; }; template < typename Type1, typename Type2 > struct Std< false > { typedef Type2 Type; }; class CTest1 { /* 省略 */ }; class CTest2 { /* 省略 */ }; Std…

Template Meta-Programing 初歩 注意点

C++

Template Meta-Programing の処理はコンパイル時に行われる。 その為 Template Meta-Programing ではあくまで静的な処理しか行わない (動的な処理の切り替えは不可能)。 また、enum 名は型として使用できない。 数値として処理される。

Template Meta-Programing 初歩 その1 : 階乗

C++

template < int n > struct Factional { enum { value = n * Factional< n - 1 > }; }; template <> struct Factional< 1 > { enum { value = 1 }; }; int i = Factional< 5 >::value; /* i = 120 */

変数自体を実行

C++

class Test { /* 省略 */ }; Test var; とした時に class Test に operator()() を宣言・定義するだけで、 var(); と実行する関数を作ることが出来る。 STLの一部のアルゴリズムでは関数の実行結果で判定を行うのだが、 operator()( iter->Item ) という形で…

Template Meta-Programing

C++

Effective C++ という本を買いました。 で、Introductionに''Template Meta-Programing''という手法が書かれていたのでちょっと動作テスト。 #include <iostream> template < int I > struct kaijo; template <> struct kaijo<1> { enum { value = 1 }; }; template < </iostream>…

explicit

C++

コンストラクタでのみ記述することの出来る指定子。 暗黙の型変換を禁止する。 explicitを用いない場合 class ExpSample { ... public: ExpSample() ExpSample(int num) }; explicitを用いない場合、 以下ではコンストラクタ ExpSample(int num) による初期…

コピーコンストラクタと代入演算子を自分で宣言・定義する場合の用意

C++

デフォルトのコピーコンストラクタと代入演算子でも殆どの場合は用途を達成できますが、 クラスで動的なメモリ領域を使用している場合は、 ユーザが自分でコピーコンストラクタと代入演算子(operator=)を自分で宣言・定義して 動的に確保されているメモリ領…

デフォルトコピーコンストラクタとデフォルト代入演算子の動作

C++

C++の殆どのコンパイラではコピーコンストラクタと代入演算子は必要であれば自動的に生成されます。 それらを デフォルトコピーコンストラクタ と デフォルト代入演算子 と言います。 class CTest { .... (コピーコンストラクタと代入演算子の宣言・定義なし…

リンクエラー : undefined reference to virtual table

C++

クラスを仮想継承してリンクした時に "undefined reference to virtual table" というリンクエラーが表示された。原因:宣言しているのに定義していないこと。要するに以下の様な状態 // パターン(宣言のみ) class TestA : virtual private Base { public:…

var might be used uninitialized in this function

C++

コンパイル中に var might be used uninitialized in this function というWarningが発生。要するに変数 var の初期化忘れが原因。 ただし、(ポインタ:newでインスタンスを確保)->(ポインタ) などの特殊な事情な場合でもWarningが出る。尤もこのWarning自体…