我正在为了娱乐和学习而实现自己的boost :: array
变体,我想知道:比较两个不同大小的数组应该返回false,还是应该是类型错误?
array<int, 3> a = {1, 2, 3};
array<int, 5> b = {1, 2, 3, 4, 5};
a == b // <--- false or type error?
我正在为了娱乐和学习而实现自己的boost :: array
变体,我想知道:比较两个不同大小的数组应该返回false,还是应该是类型错误?
array<int, 3> a = {1, 2, 3};
array<int, 5> b = {1, 2, 3, 4, 5};
a == b // <--- false or type error?
boost::array
的人选择它而不是std::vector
,因为他们希望在编译时进行评估(和失败),而不是运行时。这个问题没有普适的答案。它取决于比较数组的代码的业务逻辑。
但是一般来说,如果我不知道比较数组的业务逻辑,我会返回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'
}
我认为这样做可以兼顾两个方面:
指导原则:让正确变得容易,让错误变得困难
如果您的数组没有公开基类,例如array<int>
,则应该返回类型错误,因为您的类函数基于强类型。如果允许大小多态性,则返回false。
更重要的是,拥有一个在所有情况下始终返回相同值的运算符的好处是什么?
array<int, 3>
和array<int, 5>
是不同的类型,就像std::vector<int>
和std::list<int>
是不同的类型一样。它们从相同的模板实例化的事实大多是无关紧要的。operator=()
来做这件事。 - sbi不同大小的数组是不相等的,在您的情况下,您在编译时就已经知道了。不要为不同大小实现相等运算符;那是毫无意义的!您已经知道它们不相等了!