`
zhangyafei_kimi
  • 浏览: 265292 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

boost.tuple源码整理和使用说明

阅读更多

Introduction

A tuple (or n-tuple) is a fixed size collection of elements. Pairs, triples, quadruples etc. are tuples. In a programming language, a tuple is a data object containing other objects as elements. These element objects may be of different types.

Tuples are convenient in many circumstances. For instance, tuples make it easy to define functions that return more than one value.

Some programming languages, such as ML, Python and Haskell, have built-in tuple constructs. Unfortunately C++ does not. To compensate for this "deficiency", the Boost Tuple Library implements a tuple construct using templates.

Source

#ifndef KIMI_TUPLE

#define KIMI_TUPLE

//依赖的其他两个boost

#include <boost/type_traits.hpp>

#include "boost/ref.hpp"

namespace kimi_boost

{

namespace tuple

{

//所有的前置声明

struct null_type;

template <bool If, class Then, class Else>struct IF;

template <class T> struct length;

template <int N, class T>struct element;

template <class T>struct access_traits;

template <class HT, class TT>struct cons;

template <class T> struct make_tuple_traits;

template <

class T0 = null_type, class T1 = null_type, class T2 = null_type,

class T3 = null_type, class T4 = null_type, class T5 = null_type,

class T6 = null_type, class T7 = null_type, class T8 = null_type,

class T9 = null_type>

class tuple;

namespace detail

{

template <class T> class non_storeable_type;

template <class T> struct wrap_non_storeable_type;

template < int N > struct get_class;

template <class T0, class T1, class T2, class T3, class T4,

class T5, class T6, class T7, class T8, class T9>

struct map_tuple_to_cons;

template <

class T0 = null_type, class T1 = null_type, class T2 = null_type,

class T3 = null_type, class T4 = null_type, class T5 = null_type,

class T6 = null_type, class T7 = null_type, class T8 = null_type,

class T9 = null_type>

struct make_tuple_mapper;

template<class T>

class generate_error;

}

inline const null_type cnull() { return null_type(); }

//实现

////////////////////////////////null_type////////////////////////////////////

////////////////////////////////null_type////////////////////////////////////

////////////////////////////////null_type////////////////////////////////////

//表示到了类型链的尾部

struct null_type{};

////////////////////////////////IF////////////////////////////////////

////////////////////////////////IF////////////////////////////////////

////////////////////////////////IF////////////////////////////////////

//template meta的选择逻辑

template <bool If, class Then, class Else>

struct IF

{

typedef Then RET;

};

template <class Then, class Else>

struct IF<false, Then, Else>

{

typedef Else RET;

};

////////////////////////////////length////////////////////////////////////

////////////////////////////////length////////////////////////////////////

////////////////////////////////length////////////////////////////////////

//来获得tuple的长度(即所含元素个数)

template<class T>

struct length {

static const int value = 1 + length<typename T::tail_type>::value;

};

template<>

struct length<tuple<> > {

static const int value = 0;

};

template<>

struct length<null_type> {

static const int value = 0;

};

////////////////////////////////element////////////////////////////////////

////////////////////////////////element////////////////////////////////////

////////////////////////////////element////////////////////////////////////

//element<N,cons<...> >::typecons中第N个元素的类型

template<int N, class T>// 这个int N会递减,以呈现递归的形式

struct element

{

private:

//Tcons<...>类型鸥

// cons<>内部有两个关键的typedefhead_typetail_type

// typedef HT head_type;

// typedef TT tail_type;

typedef typename T::tail_type Next;

public:

typedef typename element<N-1, Next>::type type;//递归

};

//0的特化

template<class T>

struct element<0,T>

{

//递归至N=0时,山穷水尽

// 山穷水尽时直接将head_type定义为type

typedef typename T::head_type type;

};

//const T的特化

template<int N, class T>

struct element<N, const T>

{

private:

typedef typename T::tail_type Next;

typedef typename element<N-1, Next>::type unqualified_type;

public:

typedef typename boost::add_const<unqualified_type>::type type;

};

//0const T的特化

template<class T>

struct element<0,const T>

{

typedef typename boost::add_const<typename T::head_type>::type type;

};

////////////////////////////////access_traits////////////////////////////////////

////////////////////////////////access_traits////////////////////////////////////

////////////////////////////////access_traits////////////////////////////////////

//access_traits<T>::parameter_typetuple的构造函数中使用

template <class T>

struct access_traits

{

typedef const T& const_type;

typedef T& non_const_type;

//parameter_typetuple的构造函数中使用

//remove_cv去掉constvolatile属性

//再加上const &属性

//为什么要作这么麻烦的举动,就是因为你可能会将常量或临时对象作为参数传递给构造函数,

//C++标准不允许它们绑定到非const引用。

//为什么要用引用型别作参数型别?自然是为了效率着想。

typedef const typename boost::remove_cv<T>::type& parameter_type;

};

//因为不存在引用的引用,所有要有一个针对引用的偏特化版本

template <class T>

struct access_traits<T&>

{

typedef T& const_type;

typedef T& non_const_type;

typedef T& parameter_type;

};

namespace detail {

////////////////////////////////wrap_non_storeable_type////////////////////////////////////

////////////////////////////////wrap_non_storeable_type////////////////////////////////////

////////////////////////////////wrap_non_storeable_type////////////////////////////////////

//用来侦测你是否使用了void型别和函数类型

//因为这两种型别不能像int那样定义它们的变量

template <class T>

struct wrap_non_storeable_type

{

// 如果为函数类型则特殊处理

// 如果不是函数类型则type就是T

typedef typename IF<

::boost::is_function<T>::value, non_storeable_type<T>, T

>::RET type;

};

template <>

struct wrap_non_storeable_type<void>

{

// 如果为void型也特殊处理

typedef non_storeable_type<void> type;

};

////////////////////////////////non_storeable_type////////////////////////////////////

////////////////////////////////non_storeable_type////////////////////////////////////

////////////////////////////////non_storeable_type////////////////////////////////////

//函数型别和void型别的外覆类,以使得它们可以合法的作为数据成员被定义

template <class T> class non_storeable_type

分享到:
评论

相关推荐

    HALCON算子函数Chapter 18: Tuple.doc

    HALCON 算子函數 Tuple HALCON 算子函數是一個功能強大且灵活的图像处理系統,Tuple 是 HALCON 算子函數的一個...總之,HALCON 算子函數的 Tuple 模組提供了豐富的算子函數,讓使用者能夠輕鬆地進行圖像處理和分析。

    没有boost命名空间的Boost.PFR.zip

    `pfr_non_boost-master`这个压缩包可能包含了Boost.PFR库的源码,供开发者在项目中直接使用或学习。通常,解压后你会找到`include`目录,其中包含`boost_pfr.hpp`或类似的头文件,它是Boost.PFR的核心接口。你可以在...

    c++ 41. Tuple 用例

    c++ 41. Tuple 用例

    THE BOOST C++ LIBRARIES

    THE BOOST C++ LIBRARIES是一份自己编译的chm格式文档,描述了如何使用boost类库,目录如下: Front page Chapter 1: Introduction 1.1 C++ and Boost 1.2 Development Process 1.3 Installation 1.4 Overview ...

    类似Boost中Tuple的实现

    Boost库中的`Tuple`是C++社区广泛使用的工具,因为它提供了灵活且类型安全的方式来组合和传递多个值。本篇文章将探讨如何实现一个类似于Boost的`Tuple`功能,并介绍与之相关的编程知识点。 首先,`Tuple`的基本概念...

    HALCON算子函数Chapter18:Tuple参考.pdf

    HALCON算子函數Tuple參考是HALCON编程语言中的一個重要组成部分,提供了丰富的Tuple操作函數,幫助开发者高效地进行图像處理、数据分析和機器學習等任务。本章節將詳細介紹Tuple的基本概念、Tuple操作函數和Tuple...

    Boost.org融合模块.zip

    Boost.org 是一个知名的开源库集合,它为C++编程提供了大量的工具和库,旨在提高效率、可移植性和代码质量。这个“Boost.org融合模块.zip”文件很可能包含了Boost库中的一个或多个模块,特别是与“fusion”相关的...

    Beyond.the.C++.Standard.Library.An.Introduction.to.Boost.pdf

    `boost::tuple`则提供了一个更强大和灵活的方式来处理固定大小的数据集合。 #### 七、正则表达式支持 Boost.Regex是Boost库中一个强大的正则表达式支持库,它不仅提供了丰富的正则表达式匹配功能,还支持各种复杂...

    BOOST学习资料整理收集

    4. **侯捷_-_Boost_技术与应用**:作者侯捷是中国著名的C++专家,他的书籍深入浅出地讲解了Boost的使用和技术细节。 5. **Beyond.the.C++.Standard.Library(中文版)**:该书探讨了C++标准库之外的扩展,包括Boost库...

    BoostC++库的最小子集.zip

    12. **Boost.Bind**和**Boost.Lambda**:函数绑定和Lambda表达式,简化了函数对象的创建和使用。 13. **Boost.Serialization**:实现了序列化和反序列化,可用于持久化数据或跨进程/网络的数据交换。 这些库都是...

    c++资源Boost库及指南

    - **开源免费**:Boost库完全开源,用户可以自由地使用、修改和分发。 - **可移植性强**:可以在多种操作系统和编译器环境下使用。 - **标准化进程的推动者**:许多Boost库的功能最终被采纳进入C++标准库。 - **社区...

    boost1.57 libs源代码第二部分

    以上组件都是Boost库的重要组成部分,它们各自解决了C++编程中的特定问题,通过理解和使用这些组件,开发者可以编写出更高效、更安全、更易于维护的代码。学习和掌握Boost库的这些模块,对于提升C++开发者的技能水平...

    超越C++标准库-boost程序库导论

    Boost库是一组免费且高质量的C++源代码库集合,旨在补充和完善C++标准库的功能,提供更加灵活、高效且易于使用的工具。Boost不仅帮助开发者解决实际问题,还促进了C++语言的发展,许多Boost库中的特性已经被纳入到...

    boost库源码,不包含帮助文件

    例如,Boost的官方文档(www.boost.org/doc/libs)是理解和使用每个库的重要资料。另外,Stack Overflow和C++论坛上也有很多关于Boost库的问题和解答,可以帮助解决实际编程中遇到的问题。 总之,Boost库是C++...

    Boost C++ 库 简介(中文)

    由于Boost库的广泛采用,许多优秀的实现已被采纳进入C++标准库,例如`smart_ptr`、`tuple`和`regex`。 总的来说,Boost C++库是C++程序员的强大工具箱,无论是开发大型企业级应用还是进行研究项目,都能从中受益。...

    vs2019 cpp20规范 tuple源码注释

    vs2019 cpp20规范 tuple源码注释

    boost_1_34_0的包含文件(boost目录下的全部文件)

    Boost库的核心目标是推动C++标准的发展,并且很多Boost库最终被纳入到了C++标准库中,例如`shared_ptr`、`unique_ptr`、`bind`、`lambda`、`variant`和`tuple`等。下面将详细探讨一些在`boost_1_34_0`中重要的库和...

Global site tag (gtag.js) - Google Analytics