我正在实现我自己的boost::array
变体以获得乐趣和教育,我只是想知道:应该比较两个不同大小的数组产生错误,还是应该是类型错误?
array<int, 3> a = {1, 2, 3};
array<int, 5> b = {1, 2, 3, 4, 5};
a == b // <--- false or type error?
答案 0 :(得分:5)
应该是类型错误。使用boost::array
的人选择std::vector
,因为他们希望在编译时而不是在运行时进行评估(和失败)。
答案 1 :(得分:4)
这个问题没有一般的答案。它取决于比较数组的代码的业务逻辑。
但总的来说,如果我不知道比较数组的业务逻辑是什么,我会返回false
。如果数组大小不同,则数组不同。
答案 2 :(得分:1)
如果您的数组未公开array<int>
等基类,则会产生类型错误,因为您的类的功能基于强类型。如果允许大小中的多态,则返回false。
更重要的是,让操作员在所有情况下总能返回相同的值会带来什么好处?
答案 3 :(得分:1)
在该语言中,不同的模板实例是不相关的类型。这意味着从技术上讲,最简单的事情就是boost :: array的作用:忽略问题,如果你试图比较不同的大小,编译器会大喊。
我倾向于回答这取决于您正在建模的域,但鉴于数组大小是编译时常量,用户应该知道两个数组都是不同的,甚至没有尝试比较。即使在模板化代码中,只要存在单个大小参数,一切都将自行落实到位。
答案 4 :(得分:1)
我认为这个问题比唯一的==
运算符更为通用。
==
运算符与!=
密切相关,可能与<
,>
,<=
和>=
绑定。
定义应该在所有这些定义中保持一致,即可以比较两个不同大小的数组(无论使用何种比较),或者不是。
我怀疑两者都有用:
但是只有一个在编译期间产生警告,另一个暗示您希望在运行时发现问题(通过测试)。因此,我提供了一个“安全”操作符重载,以及一个更详细的“软”比较方法:
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)
不同大小的数组不相等,在您的情况下,您在编译时就知道了。不要为不同的大小实现相等运算符;那是没有意义的!你知道他们已经不平等了!