C++中的萃取机制(traits)

由来

在设计迭代器(iterator)时,考虑到需要经常访问迭代器所指对象之类型,称之为该迭代器的value_type,利用内嵌类型声明typedef可轻松实现隐藏所指对象类型:

template<typename T>
struct Iterator
{
    typedef T value_type;
}

如此一来,泛型算法便可通过typename Iterator&lt;T&gt;::value_type获取value_type

template<typename Iterator>
typename Iterator::value_type getValue(Iterator iter)
{
    return *iter;
}

在客户端,我们可做如下形式的调用:

vector<int> ivec{0, 1, 2, 3};
int val = getValue(ivec.begin());

STL要求,支持迭代器的算法,也应该支持原生指针,比如:

int arr[] = {0, 1, 2};
int val = getValue(arr+1);
                # 此时编译器会报错

因为int*类型(也即原生指针)不能内嵌类型声明,这里需要多一层的封装,萃取编译技术应运而生。进一步封装,便可进一步特化。

template<typename Iterator>
struct iterator_traits
{
    typedef typename Iterator::value_type value_type;
};

// 特化版本一,针对原生指针类型
template<typename T>
struct iterator_triats<T*>
{
    typedef T value_type;
};

// 特化版本二,
template<typename T>
struct iterator_traits<const T*>
{
    typedef T value_type;
};

// 重写getValue()方法
template<typename Iterator>
typename iterator_traits<Iterator>::value_type getValue(Iterator iter)
{
    return *iter;
}

这时便可实现对原生指针类型的支持:

int val = getValue(arr+1);

类型萃取(type traits)

struct __true_type{};
struct __false_type{};
template<typename T>
struct __type_traits
{
    typedef __false_type has_trivial_default_constructor;
    typedef __false_type has_trivial_destructor;
};

template<>
struct __type_traits<int>
{
    typedef __true_type has_trivial_default_constructor;
    typedef __true_type has_trivial_destructor;
};

References

[1]萃取(traits)编程技术的介绍和应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值