2015-01-13 24 views
0

我想我的方法採取任何整數類型作爲輸入(uint64_t,int,uint32_t等)。我是否需要用它們中的每一個的單獨方法聲明來重載它?如果它收到一個固定寬度的意外類型的整數,我擔心發生了什麼壞事。所有整數類型的函數重載

string 
to_string(uint64_t t) 
{ 
    stringstream convert; 
    convert << t; 
    return convert.str(); 
} 

string 
to_string(uint32_t t) 
{ 
    stringstream convert; 
    convert << t; 
    return convert.str(); 
} 

string 
to_string(int t) 
{ 
    stringstream convert; 
    convert << t; 
    return convert.str(); 
} 

(我不想使用C++ 11 to_string功能)

+2

您可以使您的功能成爲模板。另外,你有什麼反對不使用'std :: to_string'? – 5gon12eder

+0

也許我只是不明白C++ 11,但我的代碼目前不在某些機器上編譯(錯誤:'to_string'不是'std'的成員),我不想強​​加限制用戶需要C++ 11。 另一方面,也許所有的編譯器都有C++ 11,我只需修改Makefile?我想我甚至不知道它是什麼。 – Colby

+1

您可能必須向編譯器添加一個標誌。至少對於GCC來說,它是'-std = C++ 11'。還要注意['boost :: lexical_cast'](http://www.boost.org/doc/libs/1_57_0/doc/html/boost_lexical_cast.html)。 – 5gon12eder

回答

3

我不知道你有什麼反對std::to_string(),但你可以只寫一個模板,使其整體上類型:

template <typename T> 
typename std::enable_if< 
    std::is_integral<T>::value, 
    std::string 
>::type to_string(T t) 
{ 
    stringstream convert; 
    convert << t; 
    return convert.str(); 
} 
+0

所以enable_if也需要C++ 11。我猜這意味着我應該改變編譯標誌。謝謝 – Colby

+0

@Colby如果C++ 11不是一個選項,還有'boost :: enable_if'和'boost :: is_integral '。 – Barry

相關問題