首页 > 编程语言 >c++ 模板 指针类型偏特化

c++ 模板 指针类型偏特化

时间:2022-11-01 16:13:48浏览次数:56  
标签:val get type c++ heap data ptr 模板 特化

一步步来,先简单点.
目标:我们要实现一个模板类,例化后,可以通过get_val获取到值,通过get_ptr获取到指针.具体什么意思结合例子来看看吧.
例子:

struct A{
    int data;
    A(int _data = 0):data(_data){}
};
template <typename T>
 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> (T*)\n");
	 }
	 heap_node(ref_type d) :data(&d){
		 printf("<T> (T)\n");
	 }
 };

 int main() {
	 A a(10);
	 printf("ptr=%p\n",&a);
	 heap_node<A> p0(a);
	 printf("ptr=%p val=%d\n", p0.get_ptr(),p0.get_val().data);
	 heap_node<A> p1(&a);
	 printf("ptr=%p val=%d\n", p1.get_ptr(), p1.get_val().data);
	/*
	 heap_node<A*> p2(a);
	 printf("ptr=%p val=%d\n", p2.get_ptr(), p2.get_val().data);
	 heap_node<A*> p3(&a);
	 printf("ptr=%p val=%d\n", p3.get_ptr(), p3.get_val().data);
	*/
     char ch = getchar();
}
 

(不要在类里直接保存值类型的数据,可以用指针或者引用都可以)
发现heap_node<A> p2(a)或者heap_node<A> p3(&a)的时候,无法正常表达我们原来的意识,此时的val_type就变成指针类型,怎么解决呢.需要对<T*>特殊处理一下.

struct A{
    int data;
    A(int _data = 0):data(_data){}
};
template <typename T>
 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> (T*)\n");
	 }
	 heap_node(ref_type d) :data(&d){
		 printf("<T> (T)\n");
	 }
 };
//<T*>偏特化
template <typename T>
 class heap_node<T*>{
 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*> (T*)\n");
	 }
	 heap_node(ref_type d) :data(&d){
		 printf("<T*> (T)\n");
	 }
 };
 int main() {
	 A a(10);
	 printf("ptr=%p\n",&a);
	 heap_node<A> p0(a);
	 printf("ptr=%p val=%d\n", p0.get_ptr(),p0.get_val().data);
	 heap_node<A> p1(&a);
	 printf("ptr=%p val=%d\n", p1.get_ptr(), p1.get_val().data);
	
	 heap_node<A*> p2(a);
	 printf("ptr=%p val=%d\n", p2.get_ptr(), p2.get_val().data);
	 heap_node<A*> p3(&a);
	 printf("ptr=%p val=%d\n", p3.get_ptr(), p3.get_val().data);
	
     char ch = getchar();
}

可能还有const修饰T,或者实例化T为原始数据类型......,都可能出现类似的问题,可以用偏特化解决.这里就不一一列举出来哈.
我们可以发现,特例化的<T*>模板与原模板代码上几乎一样的,是不是可以优化一下呢.
直接上代码:

struct A{
    int data;
    A(int _data = 0):data(_data){}
};

template <class T>
 struct heap_node_type{
	 typedef T  val_type;
	 typedef T* ptr_type;
	 typedef T& ref_type;
 };

 template <class T>
 struct heap_node_type<T*>{
	 typedef T  val_type;
	 typedef T* ptr_type;
	 typedef T& ref_type;
 };

 template <class T>
 class heap_node :heap_node_type<T>{
 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> (T*)\n");
	 }
	 heap_node(ref_type d) :data(&d){
		 printf("<T> (T)\n");
	 }
 };
 
 int main() {
	 A a(10);
	 printf("ptr=%p\n",&a);
	 heap_node<A> p0(a);
	 printf("ptr=%p val=%d\n", p0.get_ptr(),p0.get_val().data);
	 heap_node<A> p1(&a);
	 printf("ptr=%p val=%d\n", p1.get_ptr(), p1.get_val().data);
	
	 heap_node<A*> p2(a);
	 printf("ptr=%p val=%d\n", p2.get_ptr(), p2.get_val().data);
	 heap_node<A*> 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<int> p4(b);
	 printf("ptr=%p val=%d\n", p4.get_ptr(), p4.get_val());
	 heap_node<int> p5(&b);
	 printf("ptr=%p val=%d\n", p5.get_ptr(), p5.get_val());

	 heap_node<int*> p6(b);
	 printf("ptr=%p val=%d\n", p6.get_ptr(), p6.get_val());
	 heap_node<int*> p7(&b);
	 printf("ptr=%p val=%d\n", p7.get_ptr(), p7.get_val());
     char ch = getchar();
}

image

标签:val,get,type,c++,heap,data,ptr,模板,特化
From: https://www.cnblogs.com/jlh-/p/16847819.html

相关文章

  • 黑马程序员C++
    C++基础入门1C++初识1.1第一个C++程序编写一个C++程序总共分为4个步骤创建项目创建文件编写代码运行程序1.1.1创建项目​ VisualStudio是我们用来编写C++......
  • C++ 中的 auto的用法
    auto的原理就是根据后面的值,来自己推测前面的类型是什么。auto的作用就是为了简化变量初始化,如果这个变量有一个很长很长的初始化类型,就可以用auto代替。1.用auto声明的......
  • 模板测试 Stencil testing
    渲染管线的流程:应用阶段->几何阶段->光栅阶段参考:Unity渲染流水线-知乎(zhihu.com) 模板测试发生在光栅阶段,顺序是:Alpha测试->模板测试->深度测试  U......
  • C++中string跨DLL失败解决途径
    1、问题描述:在一个MFC应用程序exe中,调用另一个DLL中的函数,函数中的一个形参是string类型的,每次调用都会出现乱码的情况,并且会崩溃。调用前:调用后: 2、原因分析: ......
  • C++:21---仿函数
    什么是仿函数所谓的仿函数(functor),是通过重载()运算符模拟函数形为的类。因此,这里需要明确两点:1仿函数不是函数,它是个类;2仿函数重载了()运算符,使得它的对......
  • C++:18---函数模板(template)
    一、模板的定义template<typenameT>以关键字template开头,后面跟一个模板参数列表,列表里面用逗号将多个模板参数隔开定义的注意事项模板的编译当编译器遇到一个模板定义时,并......
  • C++:17---sizeof运算符
    功能:以字节位单位,返回一个表达式或一个数据类型所占的字节数返回值类型:是size_t类型sizeof有无括号:sizeof不加括号,后面不可以直接跟数据类型sizeof加括号,后面既可以跟表达式......
  • C++:44---关键字virtual、override、final
    一、虚函数概念:在函数前面加virtual,就是虚函数虚函数的一些概念:只有成员函数才可定义为虚函数,友元/全局/static/构造函数都不可以虚函数需要在函数名前加上关键字virtual成......
  • C++:45---多态
    一、多态介绍面向对象的核心思想是多态性,其含义是“多种形式”概念:在子类覆盖了父类函数的情况下,用父类的指针(或引用)调用子类对象,或者通过父类指针调用覆盖函数的时候(动......
  • C++(STL):26 ---关联式容器set用法
    set容器都会自行根据键的大小对存储的键值对进行排序,只不过set容器中各键值对的键key和值value是相等的,根据key排序,也就等价为根据value排序。另外,使用set容器......