2017-04-13 7 views
0

おはよう、C++テンプレートが文字列型の場合にのみLOWcase変換を実行する

テンプレートを使用して簡単なC++リンクリストを作成しています。すべて機能していますが、テンプレートがstring型の場合は、すべての文字を小文字に変換して大文字小文字を区別しないようにして機能に追加したいと考えていました。

だから、私は、任意の単語を処理し、すべて小文字に変換するには、以下のスニペットを書きました:

 #define TEMPLATE string // changing this changes the template type in the rest of the program 
     Stack <TEMPLATE> s; //not used in this example, but just to show that I have an actual template for a class declared at some point, not just a definition called TEMPLATE 
     TEMPLATE word; // User inputs a word that is the same type of the Linked List Stack to compare if it is in the Stack. 
     cin >> word; // just showing that user defines word 
     for (unsigned int i = 0; i < word.length(); i++) 
     { 
      if (word.at(i) >= 'A' && word.at(i) <= 'Z') 
       word.at(i) += 'a' - 'A'; 
     } 

問題があるスタックに私のスタックのTEMPLATE、その後比べ単語があるときに文字列型ではなく、forループが特に文字列を参照するように記述されているため、明らかにエラーメッセージがスローされます。

したがって、この関数をより汎用的にして、どの型も渡すことができる方法はありますか? (私はそうは思わない、int型などのエラーチェックがないので、これに依存するのは唯一の文字列だ)

または、上記のコードを実行できるのは私の場合私のスタックと比較される変数のテンプレートは文字列型ですか?

私は例外処理を見ましたが、私はPythonの動作に非常に慣れていたので、C++で実装する方法を正確に理解できませんでした。

私は、文字列をすべて小文字に変換する組み込み関数を使用していないため、オプションでもなく、それらの推奨事項も探していません。

+0

マクロを使用すると、C++でテンプレートを行う方法はありません。つまり、テンプレートのキーワードがあります...解決策はテンプレートの特殊化ですが、実際のC++テンプレートを使用する必要があり、マクロのハッカーは使用しないでください。 – StoryTeller

+0

このスニペットが混乱しているか、まだ間違っているかどうかはわかりません。 My Stackクラスはテンプレートとして設計されています。私は簡単に書くことができたStack s;これらの変数の型が一緒に変更されるようにしたいと思っていました。これを行う適切な方法がある場合は、正しい方向に私を指すことができれば、私はそれを感謝したいと思います。私は他の場所でこれについて何も見ていない、それは私がそれをやっていない理由です。ありがとう。 –

+0

私は何かを混乱させていません。これはクラステンプレートについてではなく、関数テンプレートのハックについてです。 – StoryTeller

答えて

4

あなたのデータを正規化するためのオーバーロードを作成します。

std::string normalize(const std::string& s) { 
    std::string res(s); 
    for (auto& c : res) { 
     c = std::tolower(c); 
    } 
    return res; 
} 

template <typename T> 
const T& normalize(const T& t) { return t; } 
+0

が見つかりません 'return res;' –

+0

@JosephIreland:固定です、ありがとう。 – Jarod42

関連する問題