我定义了一个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 *>
来选择合适的定义,但问题是,这两个定义将共享许多代码。
3条答案
按热度按时间vtwuwzda1#
标签:C++ template specialization, calling methods on types that could be pointers or references unambiguously
同样的技术在这里也可以工作,允许您在两种情况下统一地将
val
作为引用(或指针)处理。CRTP可以帮助减少代码重复,允许两个专门化的公共代码而没有任何开销。
请注意,当您有时使用指针,有时使用示例时,所有权语义会变得棘手--如果
val
有时是参数的指针,而其他时候是参数的副本,那么val
的生存期是多少?如何强制执行它?ezykj2lf2#
还有一种方法可以做到这一点。你应该使用类型traits,它们在编译时被评估。这就是你如何修改。
字符串
7xllpg7q3#
遇到类似的问题,我是这样解决的:
字符串
输出量:
型