c++ - C++ 中的自由定理 : are templates inherently ignorant and neutral with their objects of unknown types?

标签 c++ templates abstraction type-systems type-theory

在 Haskell 中著名的是,如果我们有一个没有具体类型的函数,我们可以推断出一些关于它的行为,例如

f : a -> a

永远是身份。

使用 Java 泛型我们无法证明泛型函数具有特定行为,因为我们可以使用 instanceofObject 基类上的方法来解决这些限制,但是如果我看到带有签名的方法

<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/

相关文章:

java - 为什么 Velocity 不显示 <div >'s that should be displayed as "显示 : flex;"correctly?

abstraction - 术语 rep-invariant 和 rep ok 是什么意思?

c++ - malloc 和 New 中堆初始化的混淆

c++ - 为大型本地数据处理扩展堆栈大小是个好主意吗?

C++ : using index as template parameter in for loop

scala - Scala 能否约束对象图,以便只有与上下文相关的对象可见?

oop - 作为定义的抽象

c++ - 复制构造函数和带有std::any的构造函数之间的冲突

c++ - 使用具有 2 个数组作为参数的合并函数进行合并排序

c++ - 以下 C++ 代码是否等价? (在智能指针实现中)