【发布时间】:2011-06-11 12:40:52
【问题描述】:
有没有办法在数组大小中多态地使用新的std::array 类型?也就是说,如果我有表单的功能
void DoSomething(std::array<int, 5>& myArray) {
/* ... */
}
那么,数学上是否明确定义了执行以下操作(即使它不是合法的 C++ 代码?)
std::array<int, 10> arr;
DoSomething(arr);
这在数学上是明确定义的,有没有办法编写std::array 使其数组元素是连续的并且这段代码可以编译?我能想到的唯一技术是有一些奇怪的模板元程序,其中std::array<T, N+1> 继承自std::array<T, N>,但我不认为这会强制数组元素是连续的。
【问题讨论】:
-
如果你想要编译时多态性,为什么不直接在
N上模板化函数,或者如果你想要运行时多态性,只使用std::vector? -
@Karl Knechtel- 假设我想要一个函数,它总是接收“至少五个元素”或“至少十个元素”的数组。我可以使用模板来做到这一点,但这会导致代码重复,并且需要
static_assert-esque 代码,这并不优雅。我不能用std::vector静态检查这个。因此,让函数接受某个大小的数组的想法是尝试像 C99 静态大小的数组参数一样,可以在编译时检查。 -
我不确定你的例子。具体来说,我不确定我是否理解“数学上定义明确”的意思。在
DoSomething,如果你查询std::distance(myArray.begin(), myArray.end()),你期望的结果是什么?5或10? -
@James McNellis- 我在想“数学上定义明确”的意思是“在类型论的数学意义上,array 是 array 的子类型。”我希望它给出 10,因为这是数组的实际长度。
-
@templatetypedef: 如果它给出 10,那么它不是一个数组
。如果 DoSomething 旨在处理其他大小的数组,那么它不应该专门将 array 作为参数。这是简单的 Liskov Substitution Principal 的东西......不要被搞砸了。
标签: c++ arrays c++11 polymorphism