首页 > 编程语言 >C++ STL Template Traits 技术

C++ STL Template Traits 技术

时间:2024-01-24 16:56:38浏览次数:27  
标签:自定义 traits STL type 数据类型 Traits Template TYPE Type

C++ 的 traits 技术,是一种约定俗称的技术方案,用来为同一类数据(包括自定义数据类型和内置数据类型)提供统一的类型名(traits),这样可以统一的操作函数,例如 advance(), swap(), encode()/decode() 等。

问题描述
首先来看 traits 技术可以解决什么问题,我们拥有自定义类型
Foo, Bar,以及编译器自带类型 int, double, string,我们想要为这些不同的类型提供统一的编码函数 decode() ,该怎样实现呢?

解决方案
方案一:函数重载
首先想到的方法就是函数重载,对于不同的数据类型提供不同的编码函数实现

// 内置类型 int, double
void decode(const int data, char* buf);
void decode(const unsigned int data, char* buf);
void decode(const double data, char* buf);
// 自定义类型 Foo, Bar
void decode(const Foo& data, char* buf);
void decode(const Bar& data, char* buf);

这种方案当然可行,但我们不满足于此,因为每增加一种数据类型就需要重新实现一个函数,而同一类数据(int, unsinged int)可以使用同样的编码方法。我们想要的是针对同一种数据类型,只编写一个函数,这样有可能实现吗?

方案二:模板函数+内置字段
下面我们尝试使用模板函数来实现,自定义数据类型中定义类型字段,然后在函数中进行判断。

// 自定义类型
enum Type {
TYPE_1,
TYPE_2
};
class Foo {
Type type = Type::TYPE_1;
};
class Bar {
public:
Type type = Type::TYPE_2;
};
// 模板函数
template<typename T>
void decode(const T& data, char* buf) {
if(T::type == Type::TYPE_1) {
...
}
else if(T::type == Type::TYPE_2) {
..
}
...
}


这样一来,对于同一种自定义类型,我们只需要写一遍 decode 函数就可以了,但是对于系统自定义变量 int, double 而言,是无法在其内部定义 type 的,这时候我们该怎么办呢?这时候就需要用到 traits 技术了。

方案三:traits 模板类
traits 技术的关键在于,使用另外的模板类 type_traits 来保存不同数据类型的 type,这样就可以兼容自定义数据类型和内置数据类型,代码如下:

// 定义数据 type 类
enum Type {
TYPE_1,
TYPE_2,
TYPE_3
}

对于自定义类型,与方案二中类似,我们在类内部定义了数据类型 type,然后在 traits 类中定义同样的 type

// 自定义数据类型
class Foo {
public:
Type type = TYPE_1;
};
class Bar {
public:
Type type = TYPE_2;
};
template<typename T>
struct type_traits {
Type type = T::type;
}

对于内置数据类型,使用模板类的特化为自定义类型生成独有的 type_traits

// 内置数据类型
template<typename int>
struct type_traits {
Type type = Type::TYPE_1;
}
template<typename double>
struct type_traits {
Type type = Type::TYPE_3;
}
这样就可以为不同数据类型生成统一的模板函数

// 统一的编码函数
template<typename T>
void decode<const T& data, char* buf) {
if(type_traits<T>::type == Type::TYPE_1) {
...
}
else if(type_traits<T>::type == Type::TYPE_2) {
...

总结
traits 技术的关键在于使用第三方模板类 traits,利用模板特化的功能,实现对自定义数据和编译器内置数据的统一

参考:https://codeleading.com/article/44376031282/

标签:自定义,traits,STL,type,数据类型,Traits,Template,TYPE,Type
From: https://www.cnblogs.com/klb561/p/17985044

相关文章

  • ERROR:Only one ConfirmCallback is supported by each RabbitTemplate] with root cau
     错误:OnlyoneConfirmCallbackissupportedbyeachRabbitTemplate]withrootcause 原因:因为Spring的Bean默认都是单例;而RabbitTemplate对象同样支持一个回调。 解决:使用@Scope("prototype")可通知Spring将被注解的Bean变为多例。代码: //改Ra......
  • STL初识
    参考链接:https://blog.csdn.net/weixin_43780415/article/details/1304987631、基本概念C++STL(标准模板库)是一套功能强大的C++模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。也就是说,在我们去自己定义模板......
  • Spring RestTemplate redirect 302
     TheredirectionisfollowedautomaticallyiftherequestisaGETrequest(see thisanswer).TomakeithappenonPOSTrequests,oneoptionmightbetouseadifferentrequestfactory,like HttpComponentsClientHttpRequestFactory,andsetittousean Ht......
  • STL-算法
    STL-算法目录STL-算法查找统计算法统计查找二分查找排序和通用算法排序随机合并反转复制替换删除算法复制替换删除唯一互换生成和异变算法数值算法关系集合算法交并集实践操作Vector中去重参考资料STL的三大组件:容器(container)算法(algorithm)迭代器(iterator)。STL算法部分......
  • STL-list链表
    STL-list链表目录STL-list链表初始化创建添加删除元素遍历迭代参考函数参考资料STL-list容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的。这意味着,list容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。list容器中各个元素的......
  • STL-stack和queue堆栈和队列
    STL-stack和queue堆栈和队列目录STL-stack和queue堆栈和队列堆栈和队列特性堆栈主要操作构造函数主要操作栈顶插入和删除大小相关简单案例队列的主要操作构造函数大小相关索引访问入队/出队优先队列priority_queue初始化构造小顶堆自定义结构体排序参考资料堆栈和队列特性stack......
  • STL-vector向量
    STL-vector向量目录STL-vector向量1.头文件2.构造函数3.索引存取元素4.遍历元素4.capacity相关5.插入元素6.删除元素7.排序和翻转8.底层原理9.特殊记忆函数总结参考资料vector数组是一个能存放任意数据类型(类,结构,普通变量类型等)的动态数组,在数据结构中就相当于顺序储存的线性......
  • STL-deque双端队列
    STL-deque双端队列目录STL-deque双端队列创建初始化插入元素删除元素遍历容器函数总览deque和vector参考资料deque是double-endedqueue的缩写,又称双端队列容器,可以对其两段的数据进行操作,因为它没有capacity属性,因此不会像vector那样”旧空间不足而重新配置一块更大空间,然后......
  • STL-Set集合
    STL-Set集合目录STL-Set集合导入构造插入删除查找元素遍历元素成员方法multisetunordered_set参考资料set集合unordered_set无序集合set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。set不允许两个元素有相同的键值。不允许出现相同的两个se......
  • STL-map/unordered_map映射
    STL-map/unordered_map映射目录STL-map/unordered_map映射1.构造初始化2.数据插入3.数据查找4.迭代器遍历5.删除和清空6.成员方法7.multimap8.unordered_map9.unordered_multimap10.底层原理11.总结12.参考资料键值对容器Map映射是一种类似于字典的数据结构。它是(键,值)对的序......