您的位置:首页 > 编程语言 > C语言/C++

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

2014-09-30 15:55 218 查看
在看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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: