0

残念ながら、この記事のリンクとソースを失いましたが、それはC++のメタプログラミングとテンプレートに関するものだったことを覚えています。テンプレートアプローチに関する制限について話すとき、この記事は、テンプレートに渡されるものがジェネリック型ではなく、関連するアドレスを持つ型(またはアドレス可能、正確な単語を覚えていない)のみであるという事実について話していましたテンプレートに引数として渡すことができます。

誰かがアドレス、タイプ、テンプレート間のこの関係を明確にすることができますか?

タイプはアドレスで識別できますか?


編集

たとえば、このリンクでは、リンクされたFAQの最後の部分で、テンプレートシステムは、ジェネリック型ではなくアドレスを取るもののように記述されています。

4

2 に答える 2

3

あなたが読んだ元の記事についてはわかりませんが、編集でリンクしたFAQは、タイプとアドレスの関係については説明していません。

これは、特定の種類のテンプレートパラメータである非型パラメータについて説明しています。テンプレートパラメータには、 typenon-typetemplateの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 *

ほとんどの通常のテンプレートは、ほぼ間違いなく、整数型、列挙型、またはユーザー定義型の型パラメーターまたは非型パラメーターのいずれかを使用します。それらのどれもメモリアドレスとは何の関係もありません。テンプレートの使用とメモリアドレスの使用の間に暗黙の関係はありません。

于 2012-10-15T00:54:29.223 に答える
1

アドレスで識別される型の例を次に示します。

int foo;

template <int *IP>
class Bar {
};

Bar<&foo> baz;

でもどういうわけか、私はそれが記事の意味だとは思いません。

C++ では型自体にアドレスがありません。タイプ内の個々の定義には、独自のアドレスがある場合とない場合があります。また、型のインスタンス内にしかアドレスがないものもあります。

そこで使ったトリックは、プログラムの存続期間全体にわたって存在するオブジェクトに対してのみ使用できます。そして、オブジェクトのアドレスが型の名前の一部になります。

また、テンプレートは C++ の型でさえありません。それらは、特定のパラメーター セットでインスタンス化された場合にのみ型になります。また、住所もありません。

于 2012-10-14T22:59:02.290 に答える