2011-01-31 23 views
4

私は自分のboost::arrayバリアントを楽しく教育するために実装しています。異なるサイズの2つの配列を比較するとfalseかどうか、型エラーであるはずですか?異なるサイズの配列を比較する

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

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

はい、そうです。正直なところ、これには答えがありません。常に意味があります。時には、字句比較が必要な場合もありますが、それ以外のときは明確な論理エラーです。 –

+0

@ジェリー:字句比較は、3番目に可能な結果を​​意味します:*真*。しかし、サイズの異なる2つの配列が等しいとは考えません。 – fredoverflow

+0

それは楽しいと教育のための場合。両方を行います。 –

答えて

1

言語では、異なるテンプレートのインスタンス化は無関係の型です。つまり、技術的には、最も簡単なことは、boost :: arrayは何をするのかということです。異なるサイズを比較しようとすると、コンパイラは問題を無視します。

これはモデリングしているドメインに依存しますが、配列のサイズがコンパイル時定数であることを考えれば、両方の配列が比較しようとしても違いがないことを知っておく必要があります。テンプレート化されたコードでも、単一のサイズのパラメータが存在する限り、すべてが単独でその場所に収まります。

5

これは型エラーです。 boost::arrayを使用する人は、実行時ではなくコンパイル時に評価(および失敗)したいので、std::vectorを選択します。

+0

インラインop ==が常にfalseを返すとパフォーマンスに悪影響を及ぼすのはどうでしょうか? –

+0

@Fred:まったく、私は答えを言い換えました。 –

+0

どのようにインラインop ==は常にfalseを返しますか?コンパイル時には評価されません(有能なコンパイラを前提としています)? –

4

この質問に対する一般的な回答はありません。配列を比較しているコードのビジネスロジックに依存します。

一般的に、ビジネスロジックが配列を比較しているかどうかわからない場合、私はfalseを返します。同じサイズでなければ配列は異なります。

1

あなたの配列がarray<int>のような基底クラスを公開していない場合、クラスの関数は厳密な型定義に基づいているため、型エラーが発生します。サイズに多型を許可する場合は、falseを返します。

さらに、すべてのケースで常に同じ値を返す演算子を持つ利点は何ですか?

0

異なるサイズの配列は等しくなく、あなたのケースではコンパイル時にそれを知ることができます。異なるサイズの等価演算子を実装しないでください。それは無意味です!あなたは彼らがすでに平等ではないことを知っています!

1

私は問題が唯一の==オペレータよりも一般的だと思います。

==オペレータは密接!=に関連付けられ、そしておそらく<><=>=に接続されています。

定義は、異なるサイズの2つの配列(比較が使用されていても)を比較することも、そうでないことも可能です。

私は両方が有用であることと思われる:

  • コンパイル時エラーを:あなたは、偽ここ生臭い何か
  • ランタイム時間があると警告している:あなたはすべてのあなたを専門とする必要はありません異なるサイズを扱うためのテンプレートメソッド。

コンパイル中に警告を発するのは1つだけですが、もう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' 
} 

この道を、あなたは両方の長所を取得し、私は思う:

    それが意図なら
  • 不用心を簡単に回避することができ、コンパイル
  • コンパイル時にエラーに警告され

ガイドライン:はそれを作るEA右のそれを得るためにSY、およびC++では、それは間違って

1

を取得するのは難しい、array<int, 3>array<int, 5>std::vector<int>std::list<int>は異なるタイプであるのと同様に、さまざまな種類があります。それらが同じテンプレートからインスタンス化されているという事実は、ほとんど無関係です。

ここでは、両方をのシーケンスとして表示して比較することができます。ただし、これを行うにはイテレータがよく使用されます。

+0

彼らは異なったタイプですが、それは[SCAREy](http://chat.stackoverflow.com/transcript/10?m=241740#241740)であっても、必ずしも比較を除外しません。 –

+0

@Fred:そうではありません。しかし、 'operator =()'でそれをしないほうがいいでしょう。 – sbi

関連する問題