template
template<typename T,typename U>
vector<int>とかvector<string>とかでvectorの中身に違いが作れるのはこれがあるから。
型ごとに関数を作るのはめんどい…万能なやつがあればいいのに…→templateみたいな。
テンプレートには色々種類がある
関数テンプレート
クラステンプレート
メンバテンプレート
エイリアステンプレート
それぞれ違うのか…?と思うけど、本質は同じで、「どこで使ってるか」で名前が変わってる感じ。関数の所で使ってたら関数テンプレート、みたいな感じ。
template<typename T>みたいなのを関数やクラスなどの手前に書くと、それぞれがテンプレート関数やテンプレートクラスになるらしい。
<>の意味
<>の中に型名を書いておくと、Tの所の型がその型にセットされます。自分がその部分を「stringにして使いたい!」と思ったときには、func<string>("hogehoge")みたいにすればいいです。関数テンプレートの場合は型の推論をしてくれたりします。
typenameとclassの違い
全く同じ、文字数が違う
可読性を上げる為に使い分けたりもするらしい
特に何も考えないんだったらclassの方が文字数も少ないし良いかも
code:<>の意味について.cpp
template <class T>
void add(T a, T b) { // 今回の場合、add(int a, int b) になる
cout << (a + b) << endl;
}
int main() {
add<int>(25.5, 12.5); // intに変換されて実行される
}