3

私はスタックを扱っており、2 つが同じかどうかを確認する必要があります。私はオーバーロードしました

bool operator== 

関数をコードに追加したので、コードにロジックを追加する必要があります。2 つのスタックが同じかどうかを確認するために、長さ、データ型、および各要素の内容を確認します。長さと内容は問題ありません。問題を引き起こしているのはデータ型です。

関数を作成しようとしました:

...
    Type getType();
};

template <class Type>
Type getType(){ returnType;}

しかし、これはうまくいきませんでした。

私も考えました:

bool operator== (stack<Type> &lhs, stack<Type> &rhs){

    return (lsh.Type == rhs.Type);
//additional conditions will be checked.
}

それらが同じタイプかどうかを確認するにはどうすればよいですか?

編集: 2 つのスタックの最上位要素のデータ型を確認したらどうなりますか? それで十分でしょうか?

4

5 に答える 5

9

次のように実装する場合operator==:

template<typename Type>
bool operator== (const stack<Type> &lhs, const stack<Type> &rhs){
    // compare and return.
}

両方のスタックに同じタイプの要素が含まれることはすでにわかっています。それを確認する必要はありません。

異なるテンプレート引数を使用するスタックを比較できるようにしたい場合は、次のようにすることができます。

template<typename Type1, typename Type2>
bool operator== (const stack<Type1> &lhs, const stack<Type2> &rhs){
    // compare
}

次に、を使用して要素を比較すると、operator==完了です。もちろん、型andのoperator==for パラメータがない場合、コンパイラはエラーを発行します。Type1Type2

編集:素敵なエラーメッセージが必要なので、これを行うことができます(C++ 11を使用):

#include <type_traits>

template<typename Type1, typename Type2>
bool operator== (const stack<Type1> &lhs, const stack<Type2> &rhs){
    // This is a compile time assert!
    static_assert(std::is_same<Type1, Type2>::value, "Types are not equal!");
    // compare
}

とにかくこれは避けたい。このチェックを自分で行うよりも、コンパイラに独自のエラーを発行させる方が簡単です。

于 2012-10-12T17:40:03.650 に答える
6

C++ は、型をチェックする必要がないという点で、他の (動的) 言語とは異なります。2 つのスタックに異なる型が含まれている場合、それらを比較しようとしてもコードはコンパイルされません。つまり、このステップをスキップすると、コンパイラーが自動的に実行します。

于 2012-10-12T17:40:34.553 に答える
2

テンプレートを使用してスタック データ構造を実装する場合(例: template <typename T> class Stack...)、オーバーロードoperator==してサイズをチェックし、アイテムごとの比較を行うだけです。

template <typename T>
bool operator==(const Stack<T> & lhs, const Stack<T> & rhs)
{
  if (lhs.Size() != rhs.Size())
    return false;

  // Compare item by item
  ...
}

型は、C++ コンパイラの型システムによって暗黙的にチェックされます ( があり、Stack<int>と比較しようとするとStack<string>、コンパイラ エラーが発生します)。

于 2012-10-12T17:43:23.727 に答える
0

stackoverflow の C++ タグ定義でわかるように

C++ is a widely-used, statically-typed, free-form, compiled,
multi-paradigm, multi-level, imperative, general-purpose,
object-oriented programming language.

この定義statically-typedでは、すべての型情報がコンパイル時にクリーンである必要があることを意味します。そのため、C++ で異なる型のコンテナーが必要な場合、または異なる型のコンテナーを比較したい場合は、コンパイル時にテンプレートを使用して識別する必要があります。

したがって、2 つの異なるタイプのコンテナー (ここではスタック) を比較する場合、両方のコンテナーのタイプがわかっているので、それらのタイプを比較する必要はありません。したがって、異なるタイプのコンテナーが必要な場合は、それらをすべて同じクラスから派生させて、同じタイプとして格納できるようにするか、保持する必要がありますvoid*(何をしているのかわからない限り、これは非常に危険です)。すべてのクラスを同じクラスから派生させる場合は、基本クラスを (少なくとも 1 つの仮想関数を追加することによって) 単純にポリモーフィックにし、typeid を使用してオブジェクトの型を取得するか、比較を行う仮想関数を追加してから特殊化することができます。各派生クラス (または両方の手法を組み合わせることもできます) の場合void*、オブジェクトのタイプを識別する別の方法が必要です!

于 2012-10-12T18:06:18.390 に答える