templateのテンプレートにおけるclassとtypenameの違い
前言
同じところ
テンプレートパラメータの種類
書くこともできます
どちらも同じで、違いはありません.両者
同じである以上、なぜこの2つの記号を定義しますか?テンプレートを定義する最初の方法はtemplateですが、classはあくまでクラスと考えられており、使用時に少し混同されるのは避けられません.つまりtypenameを定義してパラメータタイプ をマークします.の最も重要なtypenameについては、ネスト依存型、すなわちタイプがネスト可能である.これも二つの違いです.
相違点
ネスト依存とは?簡単な例で見ると
以上が
ここでテンプレートパラメータがクラスである場合、
すべてのネスト依存タイプに
まとめ
ここでは と区別されない. を追加する必要がないことである.
traits
のプログラミングを分析する前に、テンプレートパラメータのタイプtempname
とclass
に対して一定の理解が必要で、彼らがどのような面で異なるのか、どのような面で同じなのかを理解してこそ、traits
のプログラミングの核心を体得することができる.もしあなたが両者を理解したら、次の編を直接見ることができます.同じところ
テンプレートパラメータの種類
typename
とclass
は、一般に同じであると考える.この両者はパラメータタイプにおいて確かに同じである.あなたは書くことができますtemplate<class T>
class point {};
書くこともできます
template<typename T>
class point {};
どちらも同じで、違いはありません.両者
typename
とclass
はパラメータタイプにおいて異なるものではない同じである以上、なぜこの2つの記号を定義しますか?
相違点
typename
はネスト依存に用いることができ、そのタイプを表すが、class
にはそのような機能はない.ネスト依存とは?簡単な例で見ると
template<class T>
class people
{
public:
typedef T value_type;
typedef T* pointer;
typedef T& reference;
};
template<class T>
struct man
{
public:
typedef typename T::value_type value_type;
typedef typename T::pointer pointer;
typedef typename T::reference reference;
void print()
{
cout << "man" << endl;
}
};
int main()
{
man<people<int>> Man;
Man.print();
exit(0);
}
以上が
typename
のネスト使用である.typename
は、コンパイラにこれは関数ではなく、変数ではなくタイプであることを示す.ここでtypedefを用いてパラメータタイプを再定義する.間接性が増す2.使うときも長いコードを書く必要はありません.ここで
typename
は、peopleクラスで定義タイプを一度抽出したものであり、ここでtypename
をclass
に変更するとエラーとなる.typename
主な役割:typename
はそのクラスで定義パラメータタイプを抽出することができる.すべてのネスト依存タイプに
typename
を付けるわけではありません.例外として、継承リストまたはメンバー初期化リストでベースクラスを初期化する場合、typename
キーワードを削除できます.man(int x) : T::value_type(x) {}
まとめ
ここでは
typename
について簡単な分析を行い、traits
のプログラミングの基礎を分析するのに十分である.以上の分析をもう一つまとめます.typename
とclass
は、パラメータタイプとして用いる場合と同様に、typename
は、主にネスト依存型の抽出(抽出)に用いる.class
にはこのような機能はない.typename
抽出の1つの例外は、継承またはメンバー初期化リストにおいてベースクラスを初期化する際にtypename
キーワード