2012-03-18 13 views
1

私はこのテーマについて数多くの質問をしましたが、私が使用できる回答はまだ見つかりませんでした。テンプレートクラスメンバ関数の特殊化?

私は次のようにそれが宣言され、テンプレートクラスがある:

template <typename Type, int inSize> 
class sortedVector 
{ 
    public: 
     sortedVector(); 
     int getSize(); 
     int getAmountElements(); 
     bool add(const Type &element); 

    private: 
     Type *vector; 
     int size; 
     int amountElements; 
}; 

クラスは、要素の任意の型を格納することができるソートベクトルを表すことになっています。これはプログラミングコースの課題の一部です。これまでのところ、代入で与えられた主関数は、多項式の整数とオブジェクトの両方を関数に渡しているようです。多角形は私が以前に行ったクラスです。

このベクトルは、渡されたポリゴンオブジェクトの領域、または渡されたintの値のいずれかによってソートされているはずです。

私はadd(const Type &要素)という2つの異なる実装が必要だと思います。 intをベクトルの正しい場所に配置する処理と、ポリゴンの領域を取得してベクトルの正しい場所に挿入する処理を行うものです。

テンプレートの特殊化についてAFAIKと話します。

私はいくつかの異なる方法を試しましたが、今のところコンパイラエラーによって満たされています。これを達成するための最善の方法は何でしょうか?

+0

があなたの 'sortedVector'も比較ファンクタを格納していないではないでしょうか? – pmr

+0

あなたは==を意味しますか?おそらく、私はこれについて全く新しいですが、必要な場合は後で追加します。何が必要なのでしょうか? :) – JKase

答えて

2

C++では、順序を保持するコンテナには、通常、要素の順序を決定するために使用される比較ファンクタのテンプレート引数があります。例えば、std::setを見てください。

template<typename Key, typename Compare = std::less<Key>, class Allocator = allocator<Key>> 
class set; 

この演習では、おそらくアロケータをスキップすることができます。デフォルトCompareファンクタはoperator<使用しますが、私は別の何かを使用したい場合、私はこのようなsetをインスタンス化することができます

typedef std::set<int, std::greater<int> > MySet; 

だから、あなたがここに特殊化を使用するための必要はありません。とにかく、あなたはどうすれば できますか?あなたの ソートベクターを使用することができるすべてのクラスを専門にすることはできません。なぜなら、 がどれくらいあるかわからないからです。

だから、これはこのようなsortedVector一見のための宣言アウトになるだろう:

template<typename Elem, 
     typename Compare = std::less<Elem> > 
class sortedVector { 
public: 
    // take the functor as a constructor argument in case it cannot be 
    // default constructed 
    sortedVector(Compare c = Compare()) : cmp_(c) {} 

    // ...snip... 
    void push_back(const Elem& x) { 
    cont_.push_back(x); 
    std::sort(begin(cont_), end(cont_), cmp_); 
    } 

private: 
    // trick just use a std::vector as storage and guarantee our sorted invariant 
    std::vector<Elem> cont_; 

    // we need to store the comparison functor in case it has state 
    Compare cmp_; 
}; 

#include<iostream> 
int main(){ 
    long long num; 
    std::cin>>num; 
    std::cout<<num; 
} 
+0

残念ながらこれは私が聞いたことがないものであり、割り当ての性質と制限があるため、そのような場合は使用しないでください。正直言って、私は専門化を考えて間違っているかもしれません。 – JKase

+0

この割り当てでは、指定されたクラスまたは組み込みのC++データ型のインスタンスを格納できるテンプレートクラスSortedVectorを作成します。メソッドadd()は、ベクタがいっぱいです。クラスが少なくとも持っているべきものと主要なもののリストがあります。 – JKase

+0

これはあなたが必要とするものです。私はデフォルトの実装を追加しました。 'std :: vector'に頼るのではなく、自分でストレージを作成することができます。デフォルトの' Compare'をスキップして、stdlibの機能に依存したくない場合は 'sort'を実装できます。 – pmr

関連する問題