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 *>但问题变成了,这两个定义将共享许多代码.我想知道是否有更好的方法来实现这一目标.
请参阅:C++模板特化,可以明确地调用可能是指针或引用的类型的方法
这里应该使用相同的技术,允许您val在两种情况下均匀地处理作为引用(或指针).
CRTP可以帮助减少代码重复,允许两个特化的公共代码,也没有任何开销.
请注意,当您有时使用指针(有时是实例)时,所有权语义会变得棘手 - val如果有时它是参数的指针,那么它的生命周期是什么,有时它是参数的副本,以及如何强制执行它?