C++ ⇒ VBA 書いて覚えるための初心者自己中記事

C++ ⇒ VBA 勉強の履歴を付けるというかノート代わりに使ってます

C++ テンプレート引数について 書いて覚えるための初心者自己中記事

クラステンプレートの引数にクラステンプレートを。

の勉強。

 

まず以前勉強したクラステンプレートの記事↓

 

nenechi.hatenablog.com

 

まずクラステンプレートで標準ライブラリにある、vectorについて。

vector クラステンプレートは配列に強いクラステンプレートです。

使う場合には通常通りに vector<型> オブジェクト名 

で実体を作る。

うん、思い出してきた。

実体を作ったらそれはもうクラステンプレートではなくて、指定した型のクラスとして別に存在していることになる。

 

そんで、最初の

 

クラステンプレートの引数にクラステンプレートを。

これはつまり

template < typename TYPE >

class Hoge { ...... } ; //Hogeというクラステンプレートがあるとして

 

Hoge< vectorhoge<- コレ

 

実体化されていないまさにクラステンプレートなvectorクラステンプレートをクラステンプレートの引数にしている。

ただし上記のクラステンプレート引数の記述ではNG

代わりにこうする。

template <template <typename, typename> class TEMPL> //こうする
class Hoge {
 
};
 
int main() {
	Hoge<vector> hoge;
	system("pause");
}

 

template < typename TYPE > これが

template <template <typename, typename> class TEMPL> こうなる

vectorクラステンプレートは第二引数(デフォルト引数持ち)があるから赤字はなんとなく納得できる。

そのあとの

class TEMPL

は何なんだろう。

 

 

話をいったんゼロにして

二つの引数を持ったクラステンプレートを不完全型で書くと。 

template <typename TYPE1, typename TYPE2>
class TRMPL;

 

こうなる。

これをvectorクラステンプレートだと思って

これを引数にしたクラステンプレートを作るってことは

これをtemplate<  引数はこちら  >

に入れ込むわけだから

template<
template <typename TYPE1, typename TYPE2>
class TRMPL;>

 こうなって、さいごの ; は消そうか、

あと改行やめようか。

で。

template<template <typename TYPE1, typename TYPE2> class TRMPL>

 

そして最後にvector引数部分の型の部分、TYPE1やTYPE2などのユニークな部分を消してしまうのか。

何か使わないから消すだけで、別に消さなくても支障はないようだ。

template<template <typename, typename> class TRMPL>

 そしてこうする

template <template <typename, typename> class TEMPL>
class Hoge {
public:
	void Run() {
		m_v.push_back(1); //vectorメンバ関数 配列の最後に追加する
		m_v.push_back(3);
		m_v.push_back(5);
 
		for (size_t i = 0, size = m_v.size(); i < size; ++i) {
			cout << m_v[i] << ' ';
		}
		cout << endl;
	}
private:
	TEMPL< int, allocator<int> > m_v;//引数にされたクラステンプレートを実体化
};
 
int main() {
	Hoge<vector> hoge;
	hoge.Run();
	system("pause");
}

 

 分からないのは引数にされたクラステンプレートを実体化させるところだな。

クラステンプレート引数名としてTEMPLがあるから

それをクラステンプレート名として書いた後に< > に引数を書くわけだけど。

第一引数の int はわかるけど第二引数は何だ?

allcator<int> 

がわからん。

 

 なるほど。

これはクラステンプレートを引数にしたときの話じゃなくてvectorクラステンプレートを引数にしたときだけの話だね。

vectorクラステンプレートそのものをみると

template <typename T, typename Allocator = allocator<T> >
class vector {

 

第二引数がこんな感じなのね。

このデフォルトでは第一引数の型と同じって感じになっているから

 

TEMPL< int, allocator<int> > m_v;//引数にされたクラステンプレートを実体化

こうしているのか。

 

デフォルト引数を指定するのに使える。・・・?

template <template <typename TYPE, typename ALLOC = allcator<TYPE>> class TEMPL>

テキストにさらっと書いてるけど、よくわからない。なんだこれ?

メモ的な・・?

 

 

ほかの引数。

クラステンプレートの引数に出来るもの、最後は

静的な整数定数・ポインタ

だそうです。

 

template <int n>
class Hoge {
public:
	static const int Value = n * 2;
};
 
int main() {	
	cout << Hoge<3>::Value << endl;
	system("pause");
}
//output
6

 Hogeの引数に 3 を入れたら出来た。

 

 

int n = 3;
cout << Hoge<n>::Value << endl;//この場合エラー

 

 静的でないのでエラー

 

static const int n = 3;
cout << Hoge<n>::Value << endl;//これだといける

static const つけたらOK

静的な整数定数というのは

static でconst な整数なんですね。

 

ポインタはどうだろう。

ポインタはよくわからないぞ・・・・。

 

 

ダメだ、ずっと考えてたら眠気が。

ここまで。