まずT型のクラス作って、次に「コードサイズ膨張を避けるために」特殊化クラスを親クラスとして、特殊化クラスを作るべきらしい。 基底となるクラスでデータの構造やら簡単なアクセスやらを決めて、クラスで一般向けに整形する( = はインターフェイス )と言う解釈でいいのか。どこで型の情報を保持すべきか否か正直よくわからない。
クラスを使った時に見えてしまう部分、アクセスできる部分は型を適切にするようにはしたつもり。
////array.h/////////////////
#include
////////配列クラス
template
class My_array{
private:
T* t;
unsigned index;
public:
My_array();
My_array(unsigned index_value):index(index_value){}
My_array(T* tt,unsigned index_value):t(tt),index(index_value){}
///個々の配列要素へのアクセス
T& operator[](unsigned num ){
assert( index の基底クラスとなる特殊化配列クラス
template
class My_array{
private:
void** vpp;
unsigned index;
public:
My_array();
My_array(unsigned index_value):index(index_value){}
My_array(void** tt,unsigned index_value):vpp(tt),index(index_value){}
///個々の配列要素へのアクセス
void*& operator[](unsigned num ){
assert( index
//このクラスの実態は配列クラスのインターフェイスである
template
class My_array:private My_array{
public:
typedef My_array Base;
My_array():Base(){}
My_array(unsigned i):Base(unsigned i){}
My_array(T** tt,unsigned index_value):vpp( tt ),index(index_value){}
///個々の配列要素へのアクセス
T*& operator[](unsigned i){
return static_cast( Base::operator[](i) );
}
///配列の先頭と長さ(要素数)のコピー
T*& operator=(T*& tp){
static_cast( Base::operator[](0) ) = tp;
return static_cast( Base::operator=(tp) );
}
///配列の長さを返す関数はBaseから継承している
};