3

テンプレートのポイントがコードを一般化することであることは知っていますが、そのクラスの特定のメンバー関数の 1 つが、作成されたオブジェクトのタイプに基づいて異なる反応を示すことを望みます。具体的には、DictionaryNoun または DictionaryAdjective オブジェクトの作成に使用するクラス ディクショナリを作成しました。次のようなコード構造にしたい Dictionary::print() があります。

Dictionary::print(){
   if(this is a Dictionary<Noun> object){
       // Print my nouns in some special way
   }
   if(this is a Dictionary<Adjective> object){
       // Print my adjectives in some special way
   }
   else{ //Print objects in default way}
}

私の質問は、オブジェクトの型チェックをどのように行うのですか?

4

3 に答える 3

5

C++ では、特定のテンプレート引数に対してメンバー関数を特殊化できます。たとえば、次のようなものがあるとします。

template <typename T> class Dictionary {
    /* ... */
};

次に、書くことprintでaの機能を特化できますDictionary<Noun>

template <>
    void Dictionary<Noun>::print() {
    /* ... special code for printing nouns ... */
}

Adjective同じ方法で専門化できます。最後に、どちらも一致しない場合に使用されるデフォルトの実装を書くことができます。

template <typename T>
    void Dictionary<T>::print() {
    /* ... catch-all code ... */
}

お役に立てれば!

于 2012-08-16T22:34:46.213 に答える
2

Noun特殊化を使用してこれを処理できますが、要素 ( 、Adjective)に実際の印刷を実装する代わりにDictionary<T>::print、適切なオーバーロード/メンバー関数を呼び出してコンテナーを反復処理する方が設計が優れていると思います。

void print( std::ostream& o, Noun const & n );
void print( std::ostream& o, Adjective const & a );
// Alternatively
// void Noun::print( std::ostream& );
// void Adjective::print( std::ostream& );

template <typename T>
void Dictionary<T>::print( std::ostream& o ) {
   // iterate over all elements:
   for ( T const& r : container ) {
      print( o, r );
      // alternatively: r.print(o);
   }
}
于 2012-08-16T23:40:10.450 に答える
1

関数 (またはメソッド) のオーバーロードにテンプレートは必要ありません。

void print(std::ostream &os, const Noun &v) {}
void print(std::ostream &os, const Adjective &v) {}

ただし、キャッチオールとしてテンプレートが必要です。

template<typename T>
  void print(std::stream &os, const T &v) {}
于 2012-08-16T22:47:24.663 に答える