模板元程序 (九)
2.6 空元函数
在这一章中我们所做的最重要的事就是对“元函数”这个概念的说明,但是依然有一个问题我们没有回答:到底“空元函数”(零参数)是什么样子?
从需求的观点来看,一个空元函数就是这样的类型:无论其是一个类类弄,或者是一个类模板特化,只要它提供了内嵌的 ::type 成员。如 add_const<int> 是一个空元函数,因为其总会返回同一个结果:int const。
写一个空元函数的最简单的方法就是用一个 struct 结构:
struct always_int
{
typedef int type;
};
2.7 元函数定义
最后,我们手头已经资料充分,写以对元函数进行一个全面,正式的描述。
定义
一个元函数是:
一个类模板,它的所有参数都是类型
或者
一个类类型,带有一个内嵌的可访问的结果类型为 “type”
2.8. 历史
Boost Type Traits 库的灵感来源于 SGI 的 STL 中如下的实现代码:
struct true_type {}; struct false_type {};
template <class T> struct type_traits // assume nothing
{
typedef false_type has_trivial_default_constructor;
typedef false_type has_trivial_copy_constructor;
typedef false_type has_trivial_assignment_operator;
typedef false_type has_trivial_destructor;
typedef false_type is_POD_type;
};
template<> struct type_traits<char> // specialization for char
{
typedef true_type has_trivial_default_constructor;
typedef true_type has_trivial_copy_constructor;
typedef true_type has_trivial_assignment_operator;
typedef true_type has_trivial_destructor;
typedef true_type is_POD_type;
};
更多的特化
有趣的是 SGI 的 type traits 产生类型结果,但其依然是一个 "blob",这也取消了其多态性, SGI 的设计者一定有其他的原因来使用内嵌的类型而不是布尔常数。[10]
[10] 一个可能的原因可以参考 9.2.3 节
Boost 的 type traits 库是第一个显式验证了单值元函数重要性的 C++ 库。对于单一模板,Boost 拒绝使用 “blob”,主要是因为它准备了一个一般化的名字,type traits。这个名字看起来像是要求任何新的 traits 都被加入到 blob 中,想写相同组件的人将感觉被强迫要更改这个模板的成员,而这常常可能会导致问题。同时,这种选择对于效率及互操作性方面的积极方面的影响却是不容易被了解。
设计者于是创立了这样的惯例,有布尔值的 traits 应该有一个 ::value 成员,而那些有类型结果的 traits 则有一个 ::type,因此用户不需要猜测如何来使用一个 trait。这样的选择也提示了这些值的多态性,就算没有最终结论说所有的元函数都要提供一个 ::type 成员(是否应该是 ::value?)。
事实上,type traits 直到开发 MPL 时才被当成元函数。从那时起,在 Type Traits 库中使用的惯例也成为了 MPL 元函数使用的统一协议的基础。Boost Type Traits 库则也做了相应的更新。
模板元程序 (九)
最新推荐文章于 2024-05-15 15:54:11 发布