ljymoonlight

导航

c++ template trait 用法

tempalte trait 用法

  • 最近在看代码发现有个模板类型的使用很复杂,然在网上搜索模板的使用,竟然那种用法还有较为通用的
    表述,也就是标题上的名称。 找着找着才发现原来这用法也很发杂,真心佩服第一个能将template 这样子弄的人。

  • trait 应用模板STL

  • trait 应用模板类/结构体
    这都是个人感觉体会,可能你也会有不同的看法。

Trait 用法的好处

  • 代码简洁 //逻辑相对抽象点
  • 代码易维护

Trait 用法在结构体中

  • 首先下面的例子是结构体,也就是定义一个元素或者说小单元中 。
    例如协议中又或者是界面中一个信号点,此时这个信号可以是整型、也可以是浮点型,甚至其他各种类型。
    此时第一想到较为通用的模板就是模板类来实现:
    template <typename T> 
    class AA 
    {
        T Get(); 
        T Set(); 
    };
  • 上面模板类,我们能做到的就是将信号设置和读取进行分类;但是如果我们的信号分类还有很多种,比如:
    • 内部通信用的信号
    • 外部接口用的信号
    • 系统重置后恢复默认值的信号
    • 系统重置不恢复默认值的信号 // MAC地址、IP、
    • 只读取信号 //产品名称、SN、
      从开始的模板类就显得有点单调了,此时使用下面的方法则可以对信号类型实现多态。

复杂信号的实现逻辑

  • 很多时候见得比较多的就是代码中对不同对象类型定义不同的结构体,然后一一去实现。此时就能体现出代码简洁性和易维护性。

  • 下面的定义目的都是为了不同的信号类型定义,此时发现接口都相同,就是结构体定义不同。

    上面描述的信号类型,都能够一一根据下面的模板类定义,1000个不同类型的信号,也就是1000个结构体;而不是1000个不同类型的信号代码实现。


template <typename a , bool b = true ,typename ItempType = typename a::ItemType> struct  Owner; 

template <typename a , typename ItempType > 
struct  Owner<a,true,ItempType>
{
	Owner(){printf("owner1\n");}
}; 

template <typename a ,typename ItempType> 
struct  Owner<a,false,ItempType>
{
	Owner(){printf("owner2\n");}
}; 

struct helloTraits 
{
	typedef int ItemType ; 
	ItemType aaa ; 
};

posted on 2021-05-19 22:28  ljymoonlight  阅读(150)  评论(0编辑  收藏  举报