【发布时间】:2016-09-14 14:24:53
【问题描述】:
在 Haskell 等面向函数的语言中,可以将函数定义重载到多个参数签名轴。 C++ 支持参数的数量和类型。其他语言支持参数值甚至保护子句(测试参数的条件的代码。)例如 Haskell 中的阶乘实现:
factorial :: (Integral a) => a -> a
factorial 0 = 1
factorial n = n * factorial (n - 1)
参数为 0 时的阶乘定义与参数为任何其他整数时的阶乘定义不同。
我在 C++ 中没有发现这种能力,起初我认为用这种语言实现会很困难。进一步的思考让我觉得它实际上会相当简单,并且是对语言的一个很好的补充,所以我一定错过了它。
有没有办法在本机语法或模板中做到这一点?
【问题讨论】:
-
C++ 模板可以专门用于整数常量,这与您的 Haskell 示例大致相同。 Here is a factorial function written with specialized templates in C++.
-
是的,它可以通过模板元编程来完成,但前提是参数值在编译时是已知的。 C++ 不能在运行时对参数值进行分派,只能通过虚拟方法分派。
-
这不是两个重载的函数,而是函数
factorial x = case x of 0 => 1; n => n * factorial (n - 1)上面撒了句法糖。
标签: c++