テンプレート化された関数を特殊化して、引数の型がポインターである場合とそうでない場合を区別する方法はありますか?

グルーフロン

それらのテンプレート化された関数を考えてみましょう

template <typename T> void Func(T* p)
{
  printf("pointer ");
  Func(*p);
}

template <typename T> void Func(T)
{
  printf("type");
}

いくつかのポインター型の引数を与えると、ポインター型に特化した関数が再帰的に呼び出されてポインターがなくなるようになり、最後にポインターのない関数が呼び出されるように記述したいと思います。通常、私が書く場合

int a;
int* a2 = &a;
int** a3 = &a2;
int*** a4 = &a3;
Func(a4);

出力に書き込みたい

pointer pointer pointer type

残念ながら、そのように書くと、ポインタ以外の関数を呼び出すだけで済みます。

それを達成する方法はありますか?

NathanOliver

関数を入れ替えるだけです。ではtemplate <typename T> void Func(T* p)、あなたが行うときにFunc(*p);、すべてのコンパイラは、程度であることを知っていますtemplate <typename T> void Func(T* p)したがって、ポインタがなくなったときにエラーが発生するまで、同じ関数を繰り返し呼び出すことになります。使用する場合

template <typename T> void Func(T)
{
  printf("type");
}

template <typename T> void Func(T* p)
{
  printf("pointer ");
  Func(*p);
}

次に、呼び出すとFunc(*p);、コンパイラはそれを認識しtemplate <typename T> void Func(T)、ポインタがなくなったときに呼び出します。

pointer pointer pointer type

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ