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 版權宣告:本文為博主原創文章,轉載請附上博文連結!