Traits
'folly/Traits.h'
Implements traits complementary to those provided in <type_traits>
- Implements
IsRelocatable
trait. - Implements
IsOneOf
trait - Macros to state the assumptions easily
Motivation
<type_traits>
is the Standard type-traits library defining a variety of traits such as is_integral
or is_floating_point
. This helps to gain more information about a given type.
folly/Traits.h
implements traits complementing those present in the Standard.
IsRelocatable
In C++, the default way to move an object is by calling the copy constructor and destroying the old copy instead of directly copying the memory contents by using memcpy(). The conservative approach of moving an object assumes that the copied object is not relocatable. The two following code sequences should be semantically equivalent for a relocatable type:
{
void conservativeMove(T * from, T * to) {
new(to) T(from);
(*from).~T();
}
} {
void optimizedMove(T * from, T * to) {
memcpy(to, from, sizeof(T));
}
}
Very few C++ types are non-relocatable. The type defined below maintains a pointer inside an embedded buffer and hence would be non-relocatable. Moving the object by simply copying its memory contents would leave the internal pointer pointing to the old buffer.
class NonRelocatableType {
private:
char buffer[];
char * pointerToBuffer;
...
public:
NonRelocatableType() : pointerToBuffer(buffer) {}
...
};
We can optimize the task of moving a relocatable type T using memcpy. IsRelocatable::value describes the ability of moving around memory a value of type T by using memcpy.
Usage
Declaring types
template <class T1, class T2>
class MyParameterizedType; class MySimpleType;
- Declaring a type as relocatable
Appending the lines below after definition of My*Type (MyParameterizedType
or MySimpleType
) will declare it as relocatable
/* Definition of My*Type goes here */
// global namespace (not inside any namespace)
namespace folly {
// defining specialization of IsRelocatable for MySimpleType
template <>
struct IsRelocatable<MySimpleType> : std::true_type {};
// defining specialization of IsRelocatable for MyParameterizedType
template <class T1, class T2>
struct IsRelocatable<MyParameterizedType<T1, T2>>
: ::std::true_type {};
}
To make it easy to state assumptions for a regular type or a family of parameterized type, various macros can be used as shown below.
Stating that a type is Relocatable using a macro
// global namespace
namespace folly {
// For a Regular Type
FOLLY_ASSUME_RELOCATABLE(MySimpleType);
// For a Parameterized Type
FOLLY_ASSUME_RELOCATABLE(MyParameterizedType<T1, T2>);
}
fbvector
only works with relocatable objects. If assumptions are not stated explicitly, fbvector<MySimpleType>
or fbvector<MyParameterizedType>
will fail to compile due to assertion below:
static_assert(IsRelocatable<My*Type>::value, "");
FOLLY_ASSUME_FBVECTOR_COMPATIBLE*(type) macros can be used to state that type is relocatable and has nothrow constructor.
- Stating that a type is
fbvector-compatible
using macros i.e. relocatable and has nothrow default constructor
// at global level, i.e no namespace
// macro for regular type
FOLLY_ASSUME_FBVECTOR_COMPATIBLE(MySimpleType)
// macro for types having 2 template parameters (MyParameterizedType)
FOLLY_ASSUME_FBVECTOR_COMPATIBLE_2(MyParameterizedType)
Similarly,
FOLLY_ASSUME_FBVECTOR_COMPATIBLE_1(MyTypeHavingOneParameter) macro is for family of parameterized types having 1 parameter
FOLLY_ASSUME_FBVECTOR_COMPATIBLE_3(MyTypeHavingThreeParameters) macro is for family of parameterized types having 3 parameters
FOLLY_ASSUME_FBVECTOR_COMPATIBLE_4(MyTypeHavingFourParameters) macro is for family of parameterized types having 4 parameters
Few common types, namely std::basic_string
, std::vector
, std::list
, std::map
, std::deque
, std::set
, std::unique_ptr
, std::shared_ptr
, std::function
, which are compatible with fbvector
are already instantiated and declared compatible with fbvector
. fbvector
can be directly used with any of these C++ types.
std::pair
can be safely assumed to be compatible with fbvector
if both of its components are.
IsOneOf
std::is_same<T1, T2>::value
can be used to test if types of T1 and T2 are same. folly::IsOneOf<T, T1, Ts...>::value
can be used to test if type of T1 matches the type of one of the other template parameter, T1, T2, ...Tn. Recursion is used to implement this type trait.
Traits的更多相关文章
- 仿SGI STL的traits技法
首先是iterator traits,这个是用来萃取迭代器的特性的 #ifndef _STL_ITERATOR_H_ #define _STL_ITERATOR_H_ #include <cst ...
- PHP的学习--Traits新特性
在阅读yii2源码的时候接触到了trait,就学习了一下,写下博客记录一下. 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits. Traits 是一种为类似 PHP 的 ...
- Effective C++ -----条款47:请使用traits classes表现类型信息
Traits classes使得“类型相关信息”在编译期可用.它们以template和“templates特化”完成实现. 整合重载技术(overloading)后,traits classes有可能 ...
- traits的使用
trait的作用是可以在任何地方使用trait中的方法. trait的定义与定义类相同,定义实例如下: trait tSoneTrait{ //定义一些属性 function someFunction ...
- STL源码--iterator和traits编程技法
第一部分 iterator学习 STL iterators定义: 提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式. 任何iteartor都应该提供5 ...
- PHP系列之一traits的应用
Traits 在PHP中实现在方法的重复使用:Traits与Class相似,但是它能够在Class中使用自己的方法而不用继承: Traits在Class中优先于原Class中的方法,引用PHP Doc ...
- C++ traits
[本文链接] http://www.cnblogs.com/hellogiser/p/cplusplus-traits.html [分析] 什么是traits?其实它并不是一个新的概念,上个世纪90年 ...
- STL源码分析《4》----Traits技术
在 STL 源码中,到处可见 Traits 的身影,其实 Traits 不是一种语法,更确切地说是一种技术. STL库中,有一个函数叫做 advance, 用来将某个迭代器(具有指针行为的一种 cla ...
- C++设计新思维的traits和policy
http://blog.csdn.net/zhoudaxia/article/details/4486487 这篇博客讲得挺清楚的,本来想自己写写看总结下的,不过看了下这个文章已经写得很清楚了,倒没有 ...
- STL源码分析读书笔记--第三章--迭代器(iterator)概念与traits编程技法
1.准备知识 typename用法 用法1:等效于模板编程中的class 用法2:用于显式地告诉编译器接下来的名称是类型名,对于这个区分,下面的参考链接中说得好,如果编译器不知道 T::bar 是类型 ...
随机推荐
- pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)--转载
pysam 模块介绍!!!! http://pysam.readthedocs.io/en/latest/index.html 在开发基因组相关流程或工具时,经常需要读取.处理和创建bam.vcf.b ...
- hdu 4747 mex 线段树+思维
http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...
- jq 抖动效果
1 .html <div style="margin:50px auto;width:900px;overflow:visible;"> <div id=&quo ...
- JVM虚拟机调优指南
本章通过阅读JVM垃圾搜集指南文档,整理虚拟机主要配置以及,理解不同的垃圾搜集器. 垃圾搜集算法 引用计数算法 根搜索算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 搜集算法网上有很多介 ...
- 微信公众号开发之微信JSSDK
概述 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微 ...
- 将C语言的CRC32 代码转成JAVA的CRC32 代码
public class CustomerCRC32 { private static long[] crc32Table = new long[256]; static { long crcValu ...
- css之grid layout代码解释
.wrapper { display: grid; grid-template-columns: repeat(3, 1fr);/*grid-template-columns CSS属性定义了网格列的 ...
- java应用简单递归
毕业后就怎么学过算法,还在上学的时候学过数据结构,现在基本上都还给老师了,可惜老师学费没有还给我... 情景: 类似于给定一个数字,算他由多少个数字组成,比如:36 现在有10.5.1 ,那么最佳帅3 ...
- New Concept English Two 30 82
$课文80 水晶宫 867. Perhaps the most extraordinary building of the nineteeth century was the Crystal Pal ...
- php session目录找不到的错误 Error session_start(): open(/var/lib/php/session error
问题来源 今天安装一个应用,发现提示 Error session_start(): open(/var/lib/php/session error,估计是找不到写不了啥啥啥. 于是我就去该路径下去看看 ...