2017-09-15 136 views
0

我想知道以下方法之間的主要區別是什麼。如果定義了std::to_string,是否有一種情況會導致問題之一?只有一個模板專業化有用嗎?

include <string> 
using namespace std; 


enum class eColor 
{ 
    Red 
}; 

void to_string(eColor color) 
{ 
} 

template<typename C = eColor) 
void to_string(C color) 
{ 
} 



int main() 
{ 
    to_string(eColor::Red); // assume only one of the above is defined 
    return 0; 
} 

有沒有這種情況下,上述哪一個應該是首選?

+0

您的模板將創建一個混亂。見https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice – juanchopanza

+0

另外,你爲什麼要一個模板? – juanchopanza

+0

我沒有看到模板化版本的很多觀點。但是您的示例過於簡化,您還應該顯示實現。 – user0042

回答

0

儘管之類的東西你用指令的名稱空間的不必要的污染,如果你打算使用的名字,像to_string這是特別奇怪:

模板功能,自動推斷它們的模板參數。因此,以下是絕對有效的:

int main(int argc, const char * argv[]) { 
    to_string(eColor::Red); 
    to_string("Hey"); 
    to_string(42); 
    return 0; 
} 

所以如果你真的打算泰勒的功能一個專用型你是在一些非常有趣的錯誤信息或更糟的任何錯誤信息與不必要的行爲相結合。

功能版本將至少防止一些錯誤的情況。 (它將仍然接受42,但因爲存在隱式轉換)。

1

你的函數to_string(eColor color)實際上並不是一個模板專門化,因爲它在定義之前沒有模板<>。因此,編譯器將其視爲完全定義的函數,而不是使用具體類型生成的模板。這意味着只要編譯器可以匹配參數列表,就會始終使用此函數。