c++ - 有什么方法可以根据参数值进行函数签名匹配吗?

标签 c++

在像 Haskell 这样的面向函数的语言中,可以重载函数定义和多个参数签名轴。 C++ 支持参数的数量和类型。其他语言支持参数值甚至保护子句(测试参数条件的代码)。例如 Haskell 中的阶乘实现:

factorial :: (Integral a) => a -> a  
factorial 0 = 1  
factorial n = n * factorial (n - 1) 

参数为 0 时阶乘的定义与参数为任何其他整数时阶乘的定义不同。

我还没有在 C++ 中发现这种功能,起初我认为用这种语言很难实现。进一步的思考使我认为它实际上相当简单并且是对语言的一个很好的补充,所以我一定是错过了它。

有没有办法用原生语法或模板来做到这一点?

最佳答案

我认为真正的答案是没有完全等价的。然而。模板特化很接近,但只在编译时有效,这限制了它的可用性。我们当然有分支,但与模式匹配在其他函数式编程语言中的功能相比,它的功能有限。

目前有一个关于 C++ 模式匹配的提议:P0095r1这将允许以下阶乘定义,假设概念:

template <Integral I>
I factorial(I n) {
    return inspect(n) {
        0 => 1
        n => n * factorial(n-1)
    };
}

我对语法不是很确定,但话又说回来,到目前为止这只是一个提议,所以语法本身可能会改变。

关于c++ - 有什么方法可以根据参数值进行函数签名匹配吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39492927/

相关文章:

c++ - std::function到C样式的函数指针

c# - 在 C++ 项目中使用 C# DLL

javascript - 是否可以使用 emscripten 从 C++ 和 Javascript 打印字符串?

c++ - 为什么在 lambda 中获取指向成员函数的指针会在 VS2013 上触发警告

c++ - 使用 Struct 的动态 vector

c++ - 如何在 C++11 中构建具有在编译时递增值的整数成员的结构序列

c++ - 当 char {'0' 用作查找时,std::map '0' ,0} 对会导致逻辑错误

c++ - 为什么在下面的代码中返回类型是用于运算符重载的类类型?

c++ - 需要跟踪 opencv Mats 的类型

c++ - QTimer 与 QPaintEvent