あなたが読んだ元の記事についてはわかりませんが、編集でリンクしたFAQは、タイプとアドレスの関係については説明していません。
これは、特定の種類のテンプレートパラメータである非型パラメータについて説明しています。テンプレートパラメータには、 type、non-type、templateの3種類があります。つまり、これは特に第2の種類に関するものです。
非型パラメーターの例は、Id
以下の定義にあります。
template <const char *Id>
struct C
{};
Id
タイプを表すのではなく、タイプではない、つまり実際の値を表します。この特定の例では、その値はたまたまポインタ型であり、文字列のアドレスを表しています。
これを使用して、文字列を識別子として使用してテンプレートをインスタンス化できるという考え方です。
C<"foo"> c1; // Instantiating the "foo" version of type C
C<"bar"> c2; // Instantiating the "bar" version of type C
残念ながら、このようには機能しません。これがFAQの記事です。非型テンプレートパラメータの場合、定数式を使用する必要があり、この特定のケースでは、リテラルだけでなく、外部リンケージを持つオブジェクトの識別子を使用する必要があることを説明しています。だからあなたがそれをすることができる唯一の方法はこれです:
template <const char *Id>
struct C
{
};
char id1[] = "foo";
char id2[] = "bar";
int main()
{
C<id1> c1;
C<id2> c2;
/*...*/
return 0;
}
それがFAQの記事で説明されていることです。
ただし、これも非常に特殊なケースです。これは、アドレスタイプの非タイプパラメータにのみ適用されるためです。非型パラメータがポインタ型のパラメータとして明示的に指定されているため、アドレスへの接続が指定されていることに注意してくださいconst char *
。
ほとんどの通常のテンプレートは、ほぼ間違いなく、整数型、列挙型、またはユーザー定義型の型パラメーターまたは非型パラメーターのいずれかを使用します。それらのどれもメモリアドレスとは何の関係もありません。テンプレートの使用とメモリアドレスの使用の間に暗黙の関係はありません。