在 Haskell 中著名的是,如果我们有一个没有具体类型的函数,我们可以推断出一些关于它的行为,例如
f : a -> a
永远是身份。
使用 Java 泛型我们无法证明泛型函数具有特定行为,因为我们可以使用 instanceof
或 Object
基类上的方法来解决这些限制,但是如果我看到带有签名的方法
<T> List<T> reverse(List<T> list)
假设该函数不会使用类型 T 的任何属性是合理的。
模板化 C++ 函数的类型签名似乎没有提供有关其实现的任何提示。该标准是否有任何现有或建议的功能,可以让我们编写函数签名,在 C++ 中提供类似的推论?例如,用某种方式说“此函数绝对适用于任何类型”。
最佳答案
不,没有。模板非常特别。本质上,它们只是宏,其扩展由类型信息驱动。模板是否可以用给定类型实例化几乎完全基于扩展来定义。事实上,允许实例化一个模板,只要不使用其他位,就只对其扩展的一部分进行类型检查。
扩展类型检查是否取决于 C++ 的许多特性、它的语法和语义。由于重载、隐式强制转换、强制转换和模板特化等有问题的特性,参数化属性不可能为您提供免费的定理。
有些评论提到了概念。然而,概念不会改变这个属性——它们允许明确地限制实例化,但和以前一样,没有这样的限制并不意味着它适用于所有东西。
关于c++ - C++ 中的自由定理 : are templates inherently ignorant and neutral with their objects of unknown types?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56824133/