C++惯用法:metafunction(元函数)

11 篇文章 0 订阅
 

元函数:编译期的函数

Metafunction: compile-time analogs of runtime functions

 
与运行期使用函数封装算法相对应,在C++编译期同样存在着封装算法进行编译期计算的需要。元函数(metafunction)便是实现这一需求的主要手段。元函数这一概念最早是由Boost.MPL类库提出并定义的。
 
作为在编译期进行计算的函数,元函数具有以下不同于运行期函数的特点:
  1. 输入(即参数)与输出(即返回值)均只包含两种类型:1)类型(名)2)整形常量。
  2. 可以返回一个或多个值,但不能没有返回值。
  3. 没有副作用:元函数在计算过程中既不能改变参数的值,也不具备“向控制台输入输出”之类的附加功能。
 

元函数的分类

Kinds of Metafunction

 
按照返回值的类型来划分,元函数可分为以下两大类:
  1. type型元函数:返回类型(名)的元函数,也就是在编译期进行类型计算的元函数。
    示例代码1: 示例代码1定义了一个用于编译期类型选择的元函数IF,其实现依赖于类模板IF及其特化。
    元函数IF的输入由3个模板参数构成:布尔类型B,类型名L,类型名R。
    元函数IF的输出也就是需要返回的类型由typedef语句来定义,用于返回的类型名为type。
    此处用于返回的类型名取名为type是为了遵循Boost.MPL类库的惯例。
    若B的值为true,则元函数IF返回类型名L。(此分支由模板特化来定义)
    若B的值为false,则元函数IF返回类型名R。(此分支由主模板来定义)
    此处用struct关键字而不是class关键字来定义类模板的理由是:元函数IF的返回类型必须能被外界所访问,即type的访问权限必须是public。
  2. value型元函数:返回整形常量的元函数,也就是在编译期进行常量计算的元函数。
    示例代码2:示例代码2定义了一个用于编译期计算阶乘的元函数Factorial,其实现依赖于类模板Factorial及其特化。
    元函数Factorial的输入仅由1个模板参数构成:整数类型N。
    元函数Factorial的输出也就是需要返回的整形常量由枚举或静态整形常量来定义,用于返回的常量名为value。
    此处用于返回的常量名取名为value是为了遵循Boost.MPL类库的惯例。
    若N的值为0,则元函数Factorial返回1。(此分支由模板特化来定义)
    若N的值大于0,则元函数Factorial返回N*Factorial(N-1)。(此分支由主模板来定义)
    此处用struct关键字而不是class关键字来定义类模板的理由是:元函数Factorial的返回值必须能被外界所访问,即value的访问权限必须是public。
 

返回多值的元函数

Metafunction with "Multiple returns"

 
与运行期的函数有所不同,编译期所定义的元函数也可返回不止一个值。
Boost.MPL类库中的Integral Constant Wrapper(整形常量包装器)就属于这种返回多个类型名及整形常量的元函数。
示例代码3: 示例代码3(取自Boost.MPL类库)实现了一个布尔常量的包装器。
元函数bool_共有3个返回值。
1) 布尔值value。
2) 元函数自身的类型type。
3) 布尔值value的类型value_type。
根据元函数bool_的定义,不难推出以下等式为真。
1) false_::value == false。
2) true_::type::value == true。
 

零参数元函数

Nullary Metafunction

 
元函数也可不用类模板而用普通的类来定义,此时元函数的参数个数为0,即元函数没有输入只有输出。
示例代码4:
 

“成员”元函数

Member Metafunction

 
元函数也可在类或类模板中定义,即元函数通过嵌套类的方式来实现。
这种元函数可称作“成员”元函数,也可称作“元方法”。
示例代码5: 在示例代码5(取自Boost.Pheonix类库)中,类模板value总共定义了2个元方法。
1) value型元方法no_nullary。
   这里no_nullary被定义为false_的同义词,false_的定义可参见示例代码3。
2) type型元方法result。
 

高阶元函数

Higher-order Metafunction

 
元函数的参数也可以是另一个元函数,这种元函数被称作高阶元函数。Boost.MPL类库中的transform就属于高阶元函数。
 

元函数 vs 函数

Metafunction vs Function

 
 编译期“元函数”运行期“函数”
是否允许返回多值
是否允许不返回值
是否存在副作用
是否允许零参数
能否作为类成员
是否存在高阶函数
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者:(美)默里 著,王昕 译 出版日期:2004-2-1 出版社:其它 页数:208 ISBN:9787508319124 文件格式:PDF 书籍简介 本书第1版荣获美国“软件开发”杂志评选的1996年图书震撼大奖(Jolt Award),中文版自2000年推出以来,经久不衰,获得了读者的充分肯定和高度评价。 第2版与第1版相比,在章节安排上有以下改变。增加了两章:“对象的创建与使用”和“C++中的C”。前者与“对象导言”实际上是第1版“对象的演化”一 章的彻底重写,增加了近几年面向对象方和编程方的最新研究与实践的丰硕成果;后者的添加使不熟悉C的读者可以直接使用本书。删去了四章:“输入输出流 介绍”、“多重继承”、“异常处理”和“运行时类型识别”,删去的内容均为C++中较复杂的主题,作者将它们连同C++标准完成后增加的一些内容放到本书 的第2卷中,使本书的第1卷内容显得更加集中,可以供不同程度的读者选择阅读。需要强调的是,第2版的改变不仅体现在这些章节的调整上,更多的改变体现在 每一章的字里行间,包括例子的调整和练习的补充。与众不同的精心选材和认真推敲的叙述使得第2版更趋成熟。 本书是C++领域内一本权威的著作,书中的内容、讲授方、例子和练习既适合课堂教学,又适合读者自学。无论是高等院校计算机及相关专业的学生,还是业界的从业人员,以及广大的计算机爱好者,都可从阅读本书中获益。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值