0

値またはrefによるテンプレートパラメータを持つ関数テンプレートがある場合

template<class T> void DoSomething(T& t){ t.method();}

ポインターまたはスマートポインターを処理したい場合は、最初に逆参照するのが最善であるため、コードが機能するか、次のような委任関数を記述します

template<class T> void DoSomething(T* t){ Dosomething(*t);}
4

2 に答える 2

0

これはプロジェクトによって異なります。私としては、最初のバリアントを使用します。いくつかの理由を次に示します。

  1. ポインターを渡す場合は、NULL になる可能性があることに注意してください。しかし、この関数は、指定されたパラメーターの有効性を担当する必要がありますか? 関数がツールである場合、値で動作する必要があり、パラメーターの有効性は問題ではありません。関数が値を受け入れるか、何も受け入れないと明示的に言う必要がある場合にのみ、2番目のバリアントを使用すると思います。関数が値のみを期待する場合、なぜ追加のチェックで負担をかけるのでしょうか?
  2. 逆参照されたポインターはいつでも渡すことができます。スマート ポインターを使用する場合、NULL ポインターを逆参照しようとすると、すべての標準のスマート ポインターが例外をスローするため、格納されているポインターが NULL の場合にどうするかは気にしません。
于 2012-07-12T18:02:17.333 に答える
0

すべての「それが最善か」という質問と同様に、答えは「場合による」です。議論と意見が交わされます。

ただし、2 番目の方法を使用することをお勧めします。その理由は、関数の 2 番目の形式で追加のチェックを追加できるからです。例えば:

template<class T> void DoSomething(T* t)
{
    if (t == NULL)
        give_error_somewhere();
    else
        Dosomething(*t);
}

しかし、私が言ったように、それは間違いなくあなたのプロジェクト全体に依存します.

于 2012-07-12T15:56:35.960 に答える