比较不同大小的数组

时间:2011-01-31 16:31:16

标签: c++ arrays boost comparison type-safety

我正在实现我自己的boost::array变体以获得乐趣和教育,我只是想知道:应该比较两个不同大小的数组产生错误,还是应该是类型错误?

array<int, 3> a = {1, 2, 3};
array<int, 5> b = {1, 2, 3, 4, 5};

a == b   // <--- false or type error?

7 个答案:

答案 0 :(得分:5)

应该是类型错误。使用boost::array的人选择std::vector,因为他们希望在编译时而不是在运行时进行评估(和失败)。

答案 1 :(得分:4)

这个问题没有一般的答案。它取决于比较数组的代码的业务逻辑。

但总的来说,如果我不知道比较数组的业务逻辑是什么,我会返回false。如果数组大小不同,则数组不同。

答案 2 :(得分:1)

如果您的数组未公开array<int>等基类,则会产生类型错误,因为您的类的功能基于强类型。如果允许大小中的多态,则返回false。

更重要的是,让操作员在所有情况下总能返回相同的值会带来什么好处?

答案 3 :(得分:1)

在该语言中,不同的模板实例是不相关的类型。这意味着从技术上讲,最简单的事情就是boost :: array的作用:忽略问题,如果你试图比较不同的大小,编译器会大喊。

我倾向于回答这取决于您正在建模的域,但鉴于数组大小是编译时常量,用户应该知道两个数组都是不同的,甚至没有尝试比较。即使在模板化代码中,只要存在单个大小参数,一切都将自行落实到位。

答案 4 :(得分:1)

我认为这个问题比唯一的==运算符更为通用。

==运算符与!=密切相关,可能与<><=>=绑定。

定义应该在所有这些定义中保持一致,即可以比较两个不同大小的数组(无论使用何种比较),或者不是。

我怀疑两者都有用:

  • 编译时错误:你被警告说这里有一些可疑的东西
  • runtime-time false:您不必专门化所有模板方法来处理不同的大小。

但是只有一个在编译期间产生警告,另一个暗示您希望在运行时发现问题(通过测试)。因此,我提供了一个“安全”操作符重载,以及一个更详细的“软”比较方法:

template <typename T, size_t M, size_t N>
bool soft_equal(array<T,M> const& lhs, array<T,N> const& rhs)
{
  if (M != N) { return false; }
  // comparison logic
}

template <typename T, size_t M>
bool operator==(array<T,M> const& lhs, array<T,M> const& rhs)
{
  return soft_equal(lhs,rhs); // count on the compiler to eliminate the 'if'
}

这样,我认为你可以获得两全其美:

  • 粗心的人在汇编时被警告
  • 编译时错误可以轻松解决,如果它是

指南:让它变得容易,并且很难弄错

答案 5 :(得分:1)

在C ++中,array<int, 3>array<int, 5>是不同的类型,就像std::vector<int>std::list<int>是不同的类型一样。它们从同一模板实例化的事实大多无关紧要。

现在,您可以将两者视为序列,然后进行比较就有意义了。但是,要做到这一点,通常使用迭代器。

答案 6 :(得分:0)

不同大小的数组不相等,在您的情况下,您在编译时就知道了。不要为不同的大小实现相等运算符;那是没有意义的!你知道他们已经不平等了!