[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
template< int STACK_SIZE > public:
//コンストラクタ }
//デストラクタ
} private:
//データ数
//スタックの大きさ
}; |
まず、データの保持に使用する、スタックを作ります。
2次元配列のイメージで、
BYTE*型の配列を作成します。
配列長は、テンプレート引数で指定します。
実行速度を優先するためです。
また、引数の数を示す、Len値をプロパティにしてあります。
template< int STACK_SIZE > public:
//コンストラクタ }
//デストラクタ
//メモリの解放 delete[] _Stack[ i ]; } }
//スタックサイズに応じて入力数を制限する
//カウンタを回す } return *this; }
__declspec( property( get = GetLen ) ) int Len; private:
//データ数
//スタックの大きさ }; |
template< int STACK_SIZE > public:
//コンストラクタ
_Index = -1; }
//デストラクタ
//メモリの解放 delete[] _Stack[ i ]; }
}
//スタックサイズに応じて入力数を制限する
//カウンタを回す } return *this; }
//データ取り出しインデックスセッター
//インデックスを設定 return *this; }
//キャスト
//データを返す }
__declspec( property( get = GetLen ) ) int Len; private:
//データ数
//インデックス
//スタックの大きさ }; |
配列のように扱うには、[]演算子をオーバーロードする必要があります。
しかし、スタックに詰め込まれているデータの型が不定のため、
戻り値のみをオーバロードする必要があります。
今回、[]演算子をセッターとして扱い、インデックス値を保持し、
自身を戻り値とすることで、
「キャスト演算子のオーバーロード」によって戻り値のオーバーロードを実現しています。
(戻り値のオーバーロードをする場合は戻り値専用の型を作るほうがいいのですが、
私はforeach文の機構を作るためにこういう形を取っています。)
これで、パラメータ配列としての機能は使えますが、
これでは、本来の型と異なる型で、データを受け取る事ができてしまいます。
その点を考慮し、
デバッグモード用の実行時エラーとして、
「引数として渡した場合と型が異なる場合はプログラムを落とす」という仕組みを作ります。
template< int STACK_SIZE > public:
//コンストラクタ
_Index = -1; }
//デストラクタ
//メモリの解放 delete[] _Stack[ i ]; } }
//スタックサイズに応じて入力数を制限する
#ifdef _DEBUG
#endif
//カウンタを回す } return *this; }
//データ取り出しインデックスセッター
//インデックスを設定 return *this; }
//キャスト
#ifdef _DEBUG
//メッセージボックスを出して自爆 } #endif
//データを返す }
__declspec( property( get = GetLen ) ) int Len; private:
//データ数
//インデックス
//スタックの大きさ
#ifdef _DEBUG #endif }; |
void Func( CVaArg< 6 >& Args_ ){ for( int i = 0 ; i < Args_.Len ; i++ ){ printf( "%d " , ( int )Args_[ i ] ); } } int main( void ){ Func( ( CVaArg< 6 >() , 0 , 1 , 2 , 3 ) ) } |
Func関数に渡している引数を見てください、
関数の()の内側に更に()を書いて、その中にパラメータ配列のコンストラクタと、引数を書きます
テンプレート引数にあるのは、引数の最大値で、
それに続けて引数を書き連ねます。
あくまで最大値なので、それより少なくても、構いません。
Func関数側では、データ数だけ値を表示します。
printfには暗黙キャストが使えないため、明示的にキャストしています。
実はこのクラスは、これだけの機能ではなく
・動的な引数の追加
・インデックス設定後の遅延データ取得
・↑を利用したforeach的機能
等、いろいろな事ができるように設計してます。
実際に制作で使っているのは、もっと色々盛り込んだものですが、
こういった仕組みを作るのも面白いです。
そ~れ~で~は~(*’∀`)ノ
COMMENT