c++ 模板 指针类型偏特化
一步步来,先简单点.
目标:我们要实现一个模板类,例化后,可以通过get_val获取到值,通过get_ptr获取到指针.具体什么意思结合例子来看看吧.
例子:
struct A{
int data;
A(int _data = 0):data(_data){}
};
template
class heap_node{
public:
typedef T val_type;
typedef T* ptr_type;
typedef T& ref_type;
ptr_type data;
ref_type get_val() { return *data; }
ptr_type get_ptr() { return data; }
heap_node(ptr_type d) :data(d){
printf(" (T*)\n");
}
heap_node(ref_type d) :data(&d){
printf(" (T)\n");
}
};
int main() {
A a(10);
printf("ptr=%p\n",&a);
heap_node p0(a);
printf("ptr=%p val=%d\n", p0.get_ptr(),p0.get_val().data);
heap_node p1(&a);
printf("ptr=%p val=%d\n", p1.get_ptr(), p1.get_val().data);
/*
heap_node p2(a);
printf("ptr=%p val=%d\n", p2.get_ptr(), p2.get_val().data);
heap_node p3(&a);
printf("ptr=%p val=%d\n", p3.get_ptr(), p3.get_val().data);
*/
char ch = getchar();
}
(不要在类里直接保存值类型的数据,可以用指针或者引用都可以)
发现heap_node> p2(a)或者heap_node> p3(&a)的时候,无法正常表达我们原来的意识,此时的val_type就变成指针类型,怎么解决呢.需要对
struct A{
int data;
A(int _data = 0):data(_data){}
};
template
class heap_node{
public:
typedef T val_type;
typedef T* ptr_type;
typedef T& ref_type;
ptr_type data;
ref_type get_val() { return *data; }
ptr_type get_ptr() { return data; }
heap_node(ptr_type d) :data(d){
printf(" (T*)\n");
}
heap_node(ref_type d) :data(&d){
printf(" (T)\n");
}
};
//偏特化
template
class heap_node{
public:
typedef T val_type;
typedef T* ptr_type;
typedef T& ref_type;
ptr_type data;
ref_type get_val() { return *data; }
ptr_type get_ptr() { return data; }
heap_node(ptr_type d) :data(d){
printf(" (T*)\n");
}
heap_node(ref_type d) :data(&d){
printf(" (T)\n");
}
};
int main() {
A a(10);
printf("ptr=%p\n",&a);
heap_node p0(a);
printf("ptr=%p val=%d\n", p0.get_ptr(),p0.get_val().data);
heap_node p1(&a);
printf("ptr=%p val=%d\n", p1.get_ptr(), p1.get_val().data);
heap_node p2(a);
printf("ptr=%p val=%d\n", p2.get_ptr(), p2.get_val().data);
heap_node p3(&a);
printf("ptr=%p val=%d\n", p3.get_ptr(), p3.get_val().data);
char ch = getchar();
}
可能还有const修饰T,或者实例化T为原始数据类型......,都可能出现类似的问题,可以用偏特化解决.这里就不一一列举出来哈.
我们可以发现,特例化的
直接上代码:
struct A{
int data;
A(int _data = 0):data(_data){}
};
template
struct heap_node_type{
typedef T val_type;
typedef T* ptr_type;
typedef T& ref_type;
};
template
struct heap_node_type{
typedef T val_type;
typedef T* ptr_type;
typedef T& ref_type;
};
template
class heap_node :heap_node_type{
public:
ptr_type data;
ref_type get_val() { return *data; }
ptr_type get_ptr() { return data; }
heap_node(ptr_type d) :data(d){
printf(" (T*)\n");
}
heap_node(ref_type d) :data(&d){
printf(" (T)\n");
}
};
int main() {
A a(10);
printf("ptr=%p\n",&a);
heap_node p0(a);
printf("ptr=%p val=%d\n", p0.get_ptr(),p0.get_val().data);
heap_node p1(&a);
printf("ptr=%p val=%d\n", p1.get_ptr(), p1.get_val().data);
heap_node p2(a);
printf("ptr=%p val=%d\n", p2.get_ptr(), p2.get_val().data);
heap_node p3(&a);
printf("ptr=%p val=%d\n", p3.get_ptr(), p3.get_val().data);
int b = 100;
printf("==========int====\nptr=%p\n", &b);
heap_node p4(b);
printf("ptr=%p val=%d\n", p4.get_ptr(), p4.get_val());
heap_node p5(&b);
printf("ptr=%p val=%d\n", p5.get_ptr(), p5.get_val());
heap_node p6(b);
printf("ptr=%p val=%d\n", p6.get_ptr(), p6.get_val());
heap_node p7(&b);
printf("ptr=%p val=%d\n", p7.get_ptr(), p7.get_val());
string str = "string";
printf("==========str====\nptr=%p %s\n", &str,str);
heap_node s4(str);
printf("ptr=%p val=%s\n", s4.get_ptr(), s4.get_val());
heap_node s5(&str);
printf("ptr=%p val=%s\n", s5.get_ptr(), s5.get_val());
heap_node s6(str);
printf("ptr=%p val=%s\n", s6.get_ptr(), s6.get_val());
heap_node s7(&str);
printf("ptr=%p val=%s\n", s7.get_ptr(), s7.get_val());
const int c = 123;
printf("==========const int====\nptr=%p\n", &c);
heap_node c4(c);
printf("ptr=%p val=%d\n", c4.get_ptr(), c4.get_val());
heap_node c5(&c);
printf("ptr=%p val=%d\n", c5.get_ptr(), c5.get_val());
heap_node c6(c);
printf("ptr=%p val=%d\n", c6.get_ptr(), c6.get_val());
heap_node c7(&c);
printf("ptr=%p val=%d\n", c7.get_ptr(), c7.get_val());
char ch = getchar();
}
