#include<iostream>
using namespace std;
/ interator type tags
struct my_input_iterator_tag{};
struct my_output_iterator_tag{};
struct my_forward_iterator_tag : public my_input_iterator_tag{};
struct my_bidirectional_iterator_tag : public my_forward_iterator_tag{};
struct my_random_access_iterator_tag : public my_bidirectional_iterator_tag{};
///traits
template<class I>
struct my_traits
{
typedef typename I::value_type value_type;
typedef typename I::iterator_category iterator_category;
};
template<class T>
struct my_traits<T*>
{
typedef T value_type;
typedef my_random_access_iterator_tag iterator_category;
};
template<class T>
struct my_traits<const T*>
{
typedef T value_type;
typedef my_random_access_iterator_tag iterator_category;
};
/_advanced
template<class InputIterator,class Distance>
inline void
_my_advanced(InputIterator& i,Distance n,my_input_iterator_tag)
{
while(n--) ++i;
}
template<class ForwardIterator,class Distance>
inline void
_my_advanced(ForwardIterator& i,Distance n,my_forward_iterator_tag)
{
while(n--) ++i;
}
template<class BidirectionalIterator,class Distance>
inline void
_my_advanced(BidirectionalIterator& i,Distance n,my_bidirectional_iterator_tag)
{
if(n>=0)
while(n--) ++i;
else
while(n++) --i;
}
template<class RandomAccessIterator,class Distance>
inline void
_my_advanced(RandomAccessIterator& i,Distance n,my_random_access_iterator_tag)
{
i += n;
cout<<"random_access_iterator"<<endl;
}
template<class InputIterator,class Distance>
inline void
my_advanced(InputIterator& i,Distance n)
{
typedef typename my_traits<InputIterator>::iterator_category category;
cout<<"it is ok!"<<endl;
//_my_advanced(i,n,category());
_my_advanced(i,n,typename my_traits<InputIterator>::iterator_category());
}
template<class I>
typename my_traits<I>::value_type
func(I iter)
{
return *iter;
}
//temp object
template<class T>
class CTemp
{
public:
CTemp(){cout<<"ctor"<<endl;}
};
int main()
{
CTemp<int> temp = CTemp<int>();// call constructor
int a = 3;
const int* pa = &a;
std::cout<<func(pa)<<endl;
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr;
int nDis = 3;
//p += 3;
my_random_access_iterator_tag tag;
my_advanced(p,nDis);
cout<<*p<<endl;
int* pzero = (int*)0;
cout<<pzero<<endl;
//cout<<*pzero<<endl;
return 0;
}
linux g++