2011-01-12 78 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)事情只是不工作。

如果我重新排列了opriginal模板以接受參數T&,那麼char *需要爲char * &,這對代碼中的靜態文本不利。

請幫忙!

+1

現在它不編譯!你需要把``放回``strlen`。 – TonyK 2011-01-12 16:39:12

回答

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++沒有一個頭<string.h>除了向後兼容性在C C的C-串頭++被稱爲<cstring>(注意龍頭c),但是從你的代碼,它看起來好像你真正的意思。頭<string>(無領導c))

+1

對不起``。我會修好它。 – 2011-01-12 14:36:55

+5

鏈接是,爲什麼它不應該被專門不錯,所以在這裏它是:http://www.gotw.ca/publications/mill17.htm – stefaanv 2011-01-12 14:48:40

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倍。第一次(浮動)預計,第三次(int &)是一個驚喜。爲什麼這不起作用?

0

真的是有風險的嘗試編碼使用的編譯型型轉換

一件事是使用基於模板的,以及其他與不同類型的使用多晶型的。

依賴於編譯器,你可以得到不同的行爲。

相關問題