2011-01-12 14 views
4

タイトルに文字列と文字ポインタの両方の関数テンプレートを特化したいと言っていますが、今まではthisでしたが、参照によって文字列パラメータを渡すことはできません。std :: stringとcharの両方の特殊化関数テンプレート*

#include <iostream> 
#include <string.h> 
template<typename T> void xxx(T param) 
{ 
std::cout << "General : "<< sizeof(T) << std::endl; 
} 

template<> void xxx<char*>(char* param) 
{ 
std::cout << "Char ptr: "<< strlen(param) << std::endl; 
} 

template<> void xxx<const char* >(const char* param) 
{ 
std::cout << "Const Char ptr : "<< strlen(param)<< std::endl; 
} 

template<> void xxx<const std::string & >(const std::string & param) 
{ 
std::cout << "Const String : "<< param.size()<< std::endl; 
} 

template<> void xxx<std::string >(std::string param) 
{ 
std::cout << "String : "<< param.size()<< std::endl; 
} 


int main() 
{ 
     xxx("word"); 
     std::string aword("word"); 
     xxx(aword); 

     std::string const cword("const word"); 
     xxx(cword); 
} 

template<> void xxx<const std::string & >(const std::string & param)ものだけでは機能しません。

パラメータをT&として受け入れるように元のテンプレートを並べ替えた場合、char *char * &である必要があります。これはコード内の静的テキストには適していません。

助けてください!

+1

今はコンパイルされません! 'strlen'のために' 'を返す必要があります。 – TonyK

答えて

9

次の作業はできませんか?

template<> 
void xxx<std::string>(std::string& param) 
{ 
    std::cout << "String : "<< param.size()<< std::endl; 
} 

const std::stringと同じですか?

あなたが選択すればdon’t specialize a function templateと言われました。代わりに、単に機能をオーバーロード:

void xxx(std::string& param) 
{ 
    std::cout << "String : "<< param.size()<< std::endl; 
} 

お知らせが、これはないテンプレートです。 99%のケースでは、これは問題ありません。

(何か他のもの、C++は、C++でのC.ザ・C列ヘッダは<cstring>と呼ばれる(大手cに注意してください)しかし、あなたが実際に意味あるかのようにあなたのコードから、それは見ているとの後方互換性を除き、ヘッダ<string.h>を持っていません。ヘッダ<string>(なし大手c))

+1

ああ申し訳ありません、 ' '。私はそれを修正します。 –

+5

なぜ特殊化してはならないのかという点ではリンクがうまくいくので、ここにはhttp://www.gotw.ca/publications/mill17.htm – stefaanv

+1

@stefaanv:niceが含まれています。 –

0

ここでは、私は驚くべき発見何の蒸留です:

#include <iostream> 

template<typename T> void f(T param) { std::cout << "General" << std::endl ; } 
template<> void f(int& param) { std::cout << "int&" << std::endl ; } 

int main() { 
    float x ; f (x) ; 
    int y ; f (y) ; 
    int& z = y ; f (z) ; 
} 

これは "一般" 3回を印刷します。初めて(float)が期待され、3回目(int &)は驚きです。なぜこれは機能しませんか?

+0

これはstd :: string&に問題があります。テンプレート内の参照された型を渡すことに何か問題があります。私は誰かがそれを説明してもらいたい。 –

0

は本当に危険な試みであるコンパイラベース型-変換を使用してコーディングする

一つのことは、ベースのテンプレートを使用することで、他は異なる種類の多形の使用です。

コンパイラによって異なる動作を得ることができます。

関連する問題