C++模板元编程(一)
首先看一个例子,利用模板元编程递归将无符号二进制数转换为十进制。
#include<iostream>
using namespace std;
// 递归,将无符号二进制转换为十进制
//
template<unsigned long N>
class binary
{
public:
static const unsigned int value = binary<N/10>::value * 2 + N % 10;
};
// 特化为N=0,终止递归
template<>
class binary<0>
{
public:
static const unsigned int value = 0;
};
int main()
{
std::cout << binary<101010>::value << std::endl;
return 0;
}
Traits和类型操纵
假设设计一个迭代器的,需要访问迭代器中的类型时。当迭代器是一个类时,可以在其中嵌套指定它的元素类型。但是普通的指针也可以用作合法的迭代器,便不能在其中指定其元素类型。
template<typename ForwardIterator1, typename ForwardIterator2>
void iterSwap(ForwardIterator1 i1, ForwardIterator i2)
{
typename ForwardIterator1::value_type tmp = *i1;
*i1 = *i2;
*i2 = tmp;
}
可以在其中引入一个中间层来解决此问题,通过该中间层进行类型计算来获得不同迭代器的元素类型。
/*************************************************************************
> File Name: traits_test.cpp
> Author: corfox
> Mail: corfox@163.com
> Created Time: 2015/12/27 11:39:56
************************************************************************/
#include <iostream>
#include <iterator>
#include <cstddef>
using namespace std;
template<typename Tp>
class IteratorTraits
{
public:
//当使用一个依赖性的名字,且该名字表示一个类型时,C++标准要求使用typename关键字表明
typedef typename Tp::value_type value_type;
typedef typename Tp::reference reference;
typedef typename Tp::pointer pointer;
typedef typename Tp::difference_type difference_type;
typedef typename Tp::iterator_category iterator_category;
};
// 偏特化Tp为指针类型
template<typename Tp>
class IteratorTraits<Tp*>
{
public:
typedef Tp value_type;
typedef Tp& reference;
typedef Tp* pointer;
typedef std::ptrdiff_t difference_type;
typedef std::random_access_iterator_tag iterator_category;
};