C++ 11标准STL中Traits的is_pointer的实现

在看STL的源码,发现is_pointer的模板调用,写了一个测试代码如下:

#include <iostream>
#include <type_traits>

using namespace::std;

namespace iotek{
	template<typename _Tp, _Tp __v>
    struct integral_constant
    {
      static constexpr _Tp                  value = __v;
      typedef _Tp                           value_type;
      typedef integral_constant<_Tp, __v>   type;
      constexpr operator value_type() { return value; }
    };

	template<typename _Tp, _Tp __v>
    constexpr _Tp integral_constant<_Tp, __v>::value;

	/// The type used as a compile-time boolean with true value.
	typedef integral_constant<bool, true>     true_type;

	/// The type used as a compile-time boolean with false value.
	typedef integral_constant<bool, false>    false_type;

	template<typename>
		struct __is_pointer_helper
		: public false_type { };

	template<typename _Tp>
		struct __is_pointer_helper<_Tp*>
		: public true_type { };

	template<typename>
		struct remove_cv;

	  /// remove_const
	template<typename _Tp>
		struct remove_const
		{ typedef _Tp     type; };

	template<typename _Tp>
		struct remove_const<_Tp const>
		{ typedef _Tp     type; };

	/// remove_volatile
	template<typename _Tp>
		struct remove_volatile
		{ typedef _Tp     type; };

	template<typename _Tp>
		struct remove_volatile<_Tp volatile>
		{ typedef _Tp     type; };

	/// remove_cv
	template<typename _Tp>
    struct remove_cv
    {
      typedef typename
      remove_const<typename remove_volatile<_Tp>::type>::type     type;
    };

	/// is_pointer
	template<typename _Tp>
    struct is_pointer
    //: public integral_constant<bool, (__is_pointer_helper<typename remove_cv<_Tp>::type>::value)>
	: public integral_constant<bool, (__is_pointer_helper<_Tp>::value)>
    { };

	/*
	public integral_const<bool,(_is_pointer_helper<remove_cv<int>::type>::value)>

	*/

	template <typename T>
	void foo(const T& val)
	{
		if(is_pointer<T>::value){
			cout << "foo() called for a pointer " << endl;
		}else{
			cout << "foo() called for a value" << endl;
		}
	}

}

using namespace::iotek;

int main(int argc, char*argv[])
{
	int i = 0;
	foo(&i);
	return 0;
}

编译使用如下命令:

gcc -std=c++11 -o test is_pointer.cpp
时间: 2024-11-08 05:04:32

C++ 11标准STL中Traits的is_pointer的实现的相关文章

C++11标准 STL正则表达式 验证电子邮件地址

转自:http://www.cnblogs.com/yejianfei/archive/2012/10/07/2713715.html 我们最经常遇到的验证,就是电子邮件地址验证.网站上常见.各种网页脚本也都常用“正则表达式”(regular expression)对我们输入的电子邮件地址进行验证,判断是否合法.有的还能分解出用户名和域名.现在用C++语言实现一下电子邮件地址验证程序,用的是C++ 11标准新增加的STL正则表达式. 源代码如下,该代码已在Visual Studio 2010上验

C++11标准库中cstdio头文件新增的5个格式化I/O函数学习

刚开始学网络编程,稍微扩展书上的简单C/S程序时,发现以前太忽略标准I/O这一块,查官网发现C++11新增了几个格式化I/O函数. snprintf    将格式化输出写入到有大小限制的缓存中 vfscanf     从流中读取数据到可变参数列表中 vscanf      读取格式化数据到可变参数列表中 vsnprintf  从可变参数列表中写入数据到有大小限制的缓存中 vsscanf     从字符串中读取格式化数据到可变参数列表中 主要谈谈snprintf,后面4个都是辅助可变参数列表的.

STL中map与hash_map的比较

1. map : C++的STL中map是使用树来做查找算法; 时间复杂度:O(log2N) 2. hash_map : 使用hash表来排列配对,hash表是使用关键字来计算表位置; 时间复杂度:O(1), 最坏的时间复杂度:O(n) 总体来说:hash_map 比 map 查找速度快,而且查找速度基本和数据量大小无关,属于常数级别,节省一定内存,如果没有必要排序的话,尽量使用 hash_map . 注:hash还有hash函数的耗时.当有100w条记录的时候,map也只需要20次的比较,20

C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动态数组)STL vector进行分析和总结. 引言 因为前段时间对台大的机器学习基石和技法课程进行了学习,发如今详细的实现中经常涉及到各种类型的数据结构,比方线性表.二叉树.图等,在使用这些数据结构时感到有些吃力.主要是对一些主要的数据结构理解的不够.所以趁着暑假假期.近期一段时间总会抽出时间复习一

c++11标准中的lambda

在c++11标准中定义了一种新的可调用对象 lambda lambda类似与匿名函数 , 只不过可以通过一种机制(不是参数)来调用一些局部变量 , 这样就能使自身的参数变少,也就能达到STL中某些算法对谓词的要求. lambda的形式: lambda表达式的引入标志,在'[]'里面可以填入变量,表示lambda要捕获的变量 , 这就是lambda的关键处 .  可以为空 lambda表达式的参数列表 , 可以没有参数 Mutable 标识 , 在某种情况下才需要 异常标识 返回类型 "函数&qu

STL笔记(6)标准库:标准库中的排序算法

STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew Austern http://www.cuj.com/experts/1908/austern.htm?topic=experts 用泛型算法进行排序    C++标准24章有一个小节叫“Sorting and related operations”.它包含了很多对已序区间进行的操作,和三个排序用泛型

STL中的Traits编程技法

最近在看读<STL源码剖析>,看到Traits编程技法这节时,不禁感慨STL源码作者的创新能力.那么什么是Traits编程技法呢?且听我娓娓道来: 我们知道容器的许多操作都是通过迭代器展开的.其中容器类似于数组,迭代器类似于指针.我们用数组来写个例子: 1 int arr[5] = {1,2,3,4,5}; 2 int *p; 3 p = &arr[2]; 假设,我将第1.2遮挡起来,问你p所指向的对象arr[2]是什么类型,你恐怕无法回答.因为它可以是int,char,float甚至

C++11新特性应用--介绍几个新增的便利算法(stl中的heap使用,最大堆)

有的时候为了维护数据,我们使用stl的堆去维护一序列. 首先您要弄清楚堆和栈的区别,即heap和stack stl中的堆默认是最大堆. 先介绍 push_heap,pop_heap,make_heap,sort_heap这四个算法,这四个不是C++11新增加的内容. 首先是如何产生一个最大推: make_heap 原型: template <class RandomAccessIterator> void make_heap (RandomAccessIterator first, Rando

参考C++STL标准库中对了的使用方法

http://www.cppblog.com/zhenglinbo/archive/2012/09/18/191170.html 参考:http://www.cppblog.com/zhenglinbo/archive/2012/09/18/191170.html 当然是使用c++中的STL 的queue啦.下面简要介绍一下使用方法. 1 准备工作 头文件 #include<queue> 2 声明和定义的方法.STL的队列是泛型模板,支持任何内置和构造类型. 比如对于刚才那个牛奶问题.我把状态