- 浏览: 266147 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
daknife:
谢谢你的这篇文章,让我大概了解了select的一部分底层原理。 ...
Linux-2.6.25 select系统调用源码分析 -
gjlzjb:
非常有用,谢谢哈。另外问下,您是否用过Pheonix Syst ...
Why Map/Reduce? -
zhangyafei_kimi:
canbo 写道请问,我怎么生成安装包,提供给其它用户安装呢? ...
下载最新的Google Chrome源码并编译 -
canbo:
请问,我怎么生成安装包,提供给其它用户安装呢?
下载最新的Google Chrome源码并编译
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<...> >::type是cons中第N个元素的类型
template<int N, class T>// 这个int N会递减,以呈现递归的形式
struct element
{
private:
//T是cons<...>类型鸥
// cons<>内部有两个关键的typedef:head_type、tail_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;
};
//0和const 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_type在tuple的构造函数中使用
template <class T>
struct access_traits
{
typedef const T& const_type;
typedef T& non_const_type;
//parameter_type在tuple的构造函数中使用
//remove_cv去掉const和volatile属性
//再加上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
发表评论
-
The Elements of Programing Style
2009-08-09 18:26 1275把代码写清楚,别耍小聪明。 想干什么,讲的简单点、直接点。 只 ... -
6个变态的C语言Hello World程序
2009-06-01 09:37 807转载自:http://cocre.com/?p=914 下面 ... -
在VS2005中使用IBM Purify的注意事项
2009-05-12 12:24 4005Rational Purify 使用及分析实例可以见这里htt ... -
boost.pool源码整理和使用说明
2007-07-22 13:49 270Source #ifndef __KIMI_BOOST_PO ... -
一个STL风格的动态二维数组
2007-07-22 18:05 1534#ifndef __KIMI_BOOST_ARRAY2#def ... -
boost.any源码整理和使用说明
2007-08-24 22:44 2107Source #include <algorithm& ... -
boost.array源码整理和使用说明
2007-08-24 22:45 1323Source #include <cstddef> ... -
boost.BOOST_STATIC_ASSERT源码整理和使用说明
2007-08-24 22:49 1370Source #include <boost/conf ... -
boost.shared_ptr源码整理和使用说明
2007-08-24 22:51 4193Source #pragma once //share ... -
boost.lexical_cast源码整理和使用说明
2007-08-24 22:55 1551Source #include <cstddef> ... -
编译期判断类的继承性
2007-08-24 23:00 1114介绍一个雕虫小技:编译期判断类的继承性。具体来说就是类型U是否 ... -
boost.type_traits源码整理和使用说明(1)
2007-08-28 01:35 2087Introduction The Boost type-tr ... -
泛型快速排序
2007-08-28 03:20 947Source #ifndef kimi_quicksort ... -
C++ Meta Programming 和 Boost MPL(1)
2007-08-30 23:01 1609本系列全部转载自kuibyshev.bokee.com ... -
C++ Meta Programming 和 Boost MPL(2)
2007-08-30 23:02 1540本系列全部转载自kuibyshev.bokee.com ... -
C++ Meta Programming 和 Boost MPL(3)
2007-08-30 23:06 1548本系列全部转载自kuibyshev.bokee.com ... -
C++ Meta Programming 和 Boost MPL(4)
2007-08-30 23:07 1719本系列全部转载自kuibyshev.bokee.com ... -
泛型归并排序
2007-09-18 00:23 1219#define SENTINEL_CARD (-1) # ... -
泛型插入排序
2007-09-18 00:25 1215#pragma once #include <iter ... -
才发现VC中也可以检测内存泄漏
2009-03-30 14:54 1385#include <stdio.h> ...
相关推荐
HALCON 算子函數 Tuple HALCON 算子函數是一個功能強大且灵活的图像处理系統,Tuple 是 HALCON 算子函數的一個...總之,HALCON 算子函數的 Tuple 模組提供了豐富的算子函數,讓使用者能夠輕鬆地進行圖像處理和分析。
`pfr_non_boost-master`这个压缩包可能包含了Boost.PFR库的源码,供开发者在项目中直接使用或学习。通常,解压后你会找到`include`目录,其中包含`boost_pfr.hpp`或类似的头文件,它是Boost.PFR的核心接口。你可以在...
c++ 41. Tuple 用例
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`是C++社区广泛使用的工具,因为它提供了灵活且类型安全的方式来组合和传递多个值。本篇文章将探讨如何实现一个类似于Boost的`Tuple`功能,并介绍与之相关的编程知识点。 首先,`Tuple`的基本概念...
HALCON算子函數Tuple參考是HALCON编程语言中的一個重要组成部分,提供了丰富的Tuple操作函數,幫助开发者高效地进行图像處理、数据分析和機器學習等任务。本章節將詳細介紹Tuple的基本概念、Tuple操作函數和Tuple...
Boost.org 是一个知名的开源库集合,它为C++编程提供了大量的工具和库,旨在提高效率、可移植性和代码质量。这个“Boost.org融合模块.zip”文件很可能包含了Boost库中的一个或多个模块,特别是与“fusion”相关的...
### Boost库学习指南与使用说明 #### 一、Boost库简介 Boost库是一个高质量的、开源的C++库集合,提供了丰富的工具和组件,旨在帮助开发者编写高效、可移植的C++程序。Boost库不仅在C++社区内享有极高的声誉,而且...
`boost::tuple`则提供了一个更强大和灵活的方式来处理固定大小的数据集合。 #### 七、正则表达式支持 Boost.Regex是Boost库中一个强大的正则表达式支持库,它不仅提供了丰富的正则表达式匹配功能,还支持各种复杂...
4. **侯捷_-_Boost_技术与应用**:作者侯捷是中国著名的C++专家,他的书籍深入浅出地讲解了Boost的使用和技术细节。 5. **Beyond.the.C++.Standard.Library(中文版)**:该书探讨了C++标准库之外的扩展,包括Boost库...
12. **Boost.Bind**和**Boost.Lambda**:函数绑定和Lambda表达式,简化了函数对象的创建和使用。 13. **Boost.Serialization**:实现了序列化和反序列化,可用于持久化数据或跨进程/网络的数据交换。 这些库都是...
- **开源免费**:Boost库完全开源,用户可以自由地使用、修改和分发。 - **可移植性强**:可以在多种操作系统和编译器环境下使用。 - **标准化进程的推动者**:许多Boost库的功能最终被采纳进入C++标准库。 - **社区...
以上组件都是Boost库的重要组成部分,它们各自解决了C++编程中的特定问题,通过理解和使用这些组件,开发者可以编写出更高效、更安全、更易于维护的代码。学习和掌握Boost库的这些模块,对于提升C++开发者的技能水平...
Boost库是一组免费且高质量的C++源代码库集合,旨在补充和完善C++标准库的功能,提供更加灵活、高效且易于使用的工具。Boost不仅帮助开发者解决实际问题,还促进了C++语言的发展,许多Boost库中的特性已经被纳入到...
例如,Boost的官方文档(www.boost.org/doc/libs)是理解和使用每个库的重要资料。另外,Stack Overflow和C++论坛上也有很多关于Boost库的问题和解答,可以帮助解决实际编程中遇到的问题。 总之,Boost库是C++...
由于Boost库的广泛采用,许多优秀的实现已被采纳进入C++标准库,例如`smart_ptr`、`tuple`和`regex`。 总的来说,Boost C++库是C++程序员的强大工具箱,无论是开发大型企业级应用还是进行研究项目,都能从中受益。...
vs2019 cpp20规范 tuple源码注释
Boost库的核心目标是推动C++标准的发展,并且很多Boost库最终被纳入到了C++标准库中,例如`shared_ptr`、`unique_ptr`、`bind`、`lambda`、`variant`和`tuple`等。下面将详细探讨一些在`boost_1_34_0`中重要的库和...