具有指针类型和常规类型的类模板

Oxd*_*eef 7 c++ templates pointers

我为其值类型定义了一个带有模板的Node类

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

大多数情况下,感兴趣的节点值将是一个对象类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; }
}
Run Code Online (Sandbox Code Playgroud)

它现在可以根据它是否可以选择合适的定义Node<int> or Node<int *>但问题变成了,这两个定义将共享许多代码.我想知道是否有更好的方法来实现这一目标.

Yak*_*ont 5

请参阅:C++模板特化,可以明确地调用可能是指针或引用的类型的方法

这里应该使用相同的技术,允许您val在两种情况下均匀地处理作为引用(或指针).

CRTP可以帮助减少代码重复,允许两个特化的公共代码,也没有任何开销.

请注意,当您有时使用指针(有时是实例)时,所有权语义会变得棘手 - val如果有时它是参数的指针,那么它的生命周期是什么,有时它是参数的副本,以及如何强制执行它?