2009-03-14 10 views
0

私は、文字列の文字を大文字に変換するテンプレートを取得しようとしています。テンプレートを使用する

私はこのプログラムを何度もやる必要があります。

私はテンプレートを使用します。

template <string theString> 
string strUpper(string theString) 
{ 
    int myLength = theString.length(); 
    for(int sIndex=0; sIndex < myLength; sIndex++) 
    { 
     if (97 <= theString[sIndex] && theString[sIndex] <= 122) 
     { 
     theString[sIndex] -= 32; 
     } 
    } 
    return theString; 
} 

テンプレートが機能した場合にのみ表示されます。 提案がありますか? 'string'識別子は即時フラグでなければなりません。

+1

なぜこれをテンプレートにしたいのですか? –

+0

文字列はどのようにエンコードされていますか? – BigSandwich

+1

Daniel Lは正しかったです(strUpper()をテンプレート以外の関数にする)上の行を削除するだけで、すべてがあなたの望むように動作します。 –

答えて

7

あなたは明らかにC++について話しています(まだタグがないので、ここではC++だと思います)。さて、あなたが私のテンプレートの引数として

を言いたいように見える、私はモデル悲しいことに、文字列

が、現在はそれがまだできていないことを任意の型を受け入れます。これは、次のC++バージョンになるconcept機能を必要とします。彼らについてのビデオはHereです。

何ができることは、あなたはそれが他のまたはカスタム文字列クラスを受け付けませんaswellとして狭い文字列

template <typename CharT, typename TraitsT> 
std::basic_string<CharT, TraitsT> strUpper(basic_string<CharT, TraitsT> theString) { 
    typedef basic_string<CharT, TraitsT> StringT; 
    for(typename StringT::iterator it = theString.begin(); 
     it != theString.end(); 
     ++it) 
    { 
     *it = std::toupper(*it, std::locale()); 
    } 
    return theString; 
} 

ワイド文字列を受け入れるようにしたい場合は、たとえば、一般的なそれを維持したい場合はbasic_string<CharT, TraitsT>を受け入れていますそれはの文字列でも起こります。あなたがいることをしたい場合、それは完全にそれを受け入れ、何の自由と何守れない

template <typename StringT> 
StringT strUpper(StringT theString) { 
    for(typename StringT::iterator it = theString.begin(); 
     it != theString.end(); 
     ++it) 
    { 
     *it = std::toupper(*it, std::locale()); 
    } 
    return theString; 
} 

あなたは、彼らはそれが機能するために公開しなければならないものの機能や種類、そのライブラリのユーザーに通知する必要があります。コンパイラはその契約について知りません。代わりに、文字列ではない型で関数を呼び出すときにエラーメッセージがスローされます。多くの場合、エラーメッセージのページが見つかるでしょうし、何がうまくいかないのかという本当の理由になるのは難しいです。次のバージョンの標準で提案されているConcepts機能は、それをうまく修正します。あなたがやった場合

ない、あなただけ先に行くとあなたがを学ぶためにその機能を発明するつもりはないをしなかった場合は、この

std::string strUpper(std::string theString) { 
    for(std::string::iterator it = theString.begin(); 
     it != theString.end(); 
     ++it) 
    { 
     *it = std::toupper(*it, std::locale()); 
    } 
    return theString; 
} 

のように正常な機能を書き込むことができるよう汎用的な関数を記述しようとしますまず最初に、既に書かれた別のアルゴリズムを見つけられなかったので、ブーストstring algorithmライブラリを調べてください。あなたは書くことができます

boost::algorithm::to_upper(mystring); 
+0

std :: stringをconst refで渡します。 –

+0

とにかくそれをコピーしなければなりません。それは呼び出し側にもっと透過的になり、より最適化されるため、値を取る方が良いです。 –

+0

私が考えることができるものを最適化できたら、ロケールオブジェクトをローカルに作成し、常にそれを再利用することです。今私は常に新しい一時的なものを作成します。しかし、私は実装の質問だと思う。その男は彼のプログラムでスタックに入れます。実際のプログラムで –

関連する問題