7

値型のテンプレートを使用して Node クラスを定義します

template<class T>
class Node {
  T val;
  public:
    Node (T & v) : val (v) {}
    ...
    void print() { cout << v << endl; }
}

ほとんどの場合、対象のノード値はオブジェクト クラス、たとえばclass Fooです。その場合、ご利用Node<Foo *>がより便利になります。しかし、ノードがプリミティブ時間を保持する可能性もありますint。それから使用Node<int>は十分です。

T問題は、一部の関数がポインター型であるかどうかに基づいて異なる動作をする必要がある場合があることです。たとえば、printあるcout << *v場合とcout << vそうでない場合です。

私が試したのは、両方を定義することです:

template<class T>
class Node {
  T val;
  public:
    Node (T & v) : val (v) {}
    ...
    void print() { cout << v << endl; }
}

template<class T>
class Node<T*> {
  T* val;
  public:
    Node (T* v) : val (v) {}
    ...
    void print() { cout << *v << endl; }
}

Node<int> or Node<int *>しかし問題は、2 つの定義が多くのコードを共有することです。これを達成するためのより良い方法があるかどうか疑問に思っています。

4

2 に答える 2

4

これを参照してください:C++テンプレートの特殊化、ポインターまたは参照である可能性のある型でメソッドを明確に呼び出す

ここでも同じ手法が機能し、valどちらの場合でも を参照 (またはポインター) として均一に処理できます。

CRTPはコードの重複を減らすのに役立ち、オーバーヘッドなしで 2 つの特殊化の共通コードを可能にします。

場合によってはポインターを使用し、場合によってはインスタンスを使用すると、所有権のセマンティクスがトリッキーになることに注意してくださいval. ?

于 2013-01-25T19:27:44.260 に答える