1. 程式人生 > >VS2010 / VC2010 BUG應對:to_string 過載函式不完整導致編譯錯誤

VS2010 / VC2010 BUG應對:to_string 過載函式不完整導致編譯錯誤

按照C++11的標準,to_string函式對每個基礎算術型別均有過載函式。但是VC2010的C++庫中沒有實現所有的過載函式,而是隻實現了其中的幾個。

參見:http://connect.microsoft.com/VisualStudio/feedback/details/576750/c-0x-std-to-string-is-non-conforming

受此影響,以下程式碼無法編譯: 

std::to_string(3); std::to_string(true);

微軟給出的解決方法是: std::to_string(static_cast<long long>(3)); std::to_string(static_cast<long long>(true));

很惱火吧?每次用到這個函式都得這麼cast過去! 經過思考,我用模板的方法避免了這個問題:

在你的C++工具箱(什麼?你還沒有工具箱?趕緊建立吧,會很有用)裡面新增如下程式碼

#include <string> #include <type_traits>   namespace std { \   template<typename T> typename enable_if<is_convertible<T, _Longlong>::value, string>::type to_string(T rhs) {     return to_string(static_cast<_Longlong>(rhs)); }   } // namespace std 主要原理是, (1)普通函式比模板函式在匹配時優先順序更高;

(2)使用了SFINAE技術,避免模板函式面對這樣的程式碼std::to_string(std::vector<int>());這樣的呼叫;

(3)如果新的庫如VC11DP完善了過載函式,那麼根據(1)可以知道本方法可以應對後續的變化。

通過這種方法,不但可以省去前面繁瑣的cast轉換,還可以達到其他顯式或隱式指定型別T的目的。比如

std::to_string<bool>(std::unique_ptr<int>(new int));   enum : std::int16_t {a, b, c}; std::to_string<bool>(c);    // 這裡將a轉換為bool的過程用模板引數體現,而不直接通過繁瑣的static_cast:std::to_string(static_cast<bool>(a)) // 不過編譯器給出的警告似乎不大正確:warning C4305: “引數”: 從“”到“bool”截斷 // 第1個雙引號內是空的,有點奇怪

希望本方法對您有幫助。

---------------------  作者:ganxinjiang  來源:CSDN  原文:https://blog.csdn.net/ganxinjiang/article/details/7338656  版權宣告:本文為博主原創文章,轉載請附上博文連結!