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 の処理はコンパイル時に行われる。 その為 Template Meta-Programing ではあくまで静的な処理しか行わない (動的な処理の切り替えは不可能)。 また、enum 名は型として使用できない。 数値として処理される。
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 */
class Test { /* 省略 */ }; Test var; とした時に class Test に operator()() を宣言・定義するだけで、 var(); と実行する関数を作ることが出来る。 STLの一部のアルゴリズムでは関数の実行結果で判定を行うのだが、 operator()( iter->Item ) という形で…
Effective C++ という本を買いました。 で、Introductionに''Template Meta-Programing''という手法が書かれていたのでちょっと動作テスト。 #include <iostream> template < int I > struct kaijo; template <> struct kaijo<1> { enum { value = 1 }; }; template < </iostream>…
コンストラクタでのみ記述することの出来る指定子。 暗黙の型変換を禁止する。 explicitを用いない場合 class ExpSample { ... public: ExpSample() ExpSample(int num) }; explicitを用いない場合、 以下ではコンストラクタ ExpSample(int num) による初期…
デフォルトのコピーコンストラクタと代入演算子でも殆どの場合は用途を達成できますが、 クラスで動的なメモリ領域を使用している場合は、 ユーザが自分でコピーコンストラクタと代入演算子(operator=)を自分で宣言・定義して 動的に確保されているメモリ領…
C++の殆どのコンパイラではコピーコンストラクタと代入演算子は必要であれば自動的に生成されます。 それらを デフォルトコピーコンストラクタ と デフォルト代入演算子 と言います。 class CTest { .... (コピーコンストラクタと代入演算子の宣言・定義なし…
クラスを仮想継承してリンクした時に "undefined reference to virtual table" というリンクエラーが表示された。原因:宣言しているのに定義していないこと。要するに以下の様な状態 // パターン(宣言のみ) class TestA : virtual private Base { public:…
コンパイル中に var might be used uninitialized in this function というWarningが発生。要するに変数 var の初期化忘れが原因。 ただし、(ポインタ:newでインスタンスを確保)->(ポインタ) などの特殊な事情な場合でもWarningが出る。尤もこのWarning自体…