同时具有指针类型和常规类型的类模板
Class template with both pointer type and regular type
>我用模板定义一个节点类作为其值类型
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 *>
来选择适当的定义 但问题是,这两个定义将共享许多代码。我想知道是否有更好的方法来实现这一目标。
请参阅以下内容: C++模板专用化,对可以是指针或引用的类型明确调用方法
相同的技术应该在这里起作用,允许您在这两种情况下将val
作为引用(或指针)统一处理。
CRTP 可以帮助减少代码重复,允许两个专用化的通用代码,而没有任何开销。
请注意,当你有时使用指针,有时使用实例时,所有权语义会变得棘手——如果有时它是参数的指针,有时它是参数的副本,那么val
的生存期是多少,你如何强制执行它?
嗯,还有另一种方法可以做到这一点。您应该使用类型特征,它们在编译时进行评估。这是您可以修改的方式。
template<class T>
class Node {
T val;
public:
Node (T & v) : val (v) {}
...
void print() {
if(std::is_pointer<T>::value)
cout << *v << endl;
else
cout << v << endl;
}
}
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 如何在C++中实现常规指针类型
- C++ 常量和常规类型的模板规范
- C++11:是否有理由为什么某些常规类型不应该专门使用“std::hash”
- 常规/动态类型作为参数C/C++
- 为什么在链表中使用指向结构的指针而不是常规结构类型变量呢
- 具有特定元素类型的常规可迭代类型
- 使用非类型模板参数而不是常规参数的原因
- 模板模板可以像常规模板一样专门用于基本类型吗?
- 同时具有指针类型和常规类型的类模板
- 将 MFC 表单'text'处理为字符类型或常规字符串类型