Darf ich wissen, wie ich std::string, in MSVC-spezifische __int64 konvertieren kann?
Antworten
Zu viele Anzeigen?_atoi64, _atoi64_l, _wtoi64, _wtoi64_l
std::string str = "1234";
__int64 v =_atoi64(str.c_str());
Siehe auch diesen Link (obwohl er für Linux/Unix ist): Warum implementiert C++ nicht die C-Standardfunktionen mit C++-Elementen/-Stil neu?
__int64
ist zwar eine Erweiterung, aber dennoch nur ein numerischer Typ. Verwenden Sie die Methode, die Sie normalerweise verwenden würden.
Boost lexikalische Besetzung ist mein Favorit. Es fasst die Antwort von Michaels in einer einfach zu verwendenden Form zusammen:
__int64 x = boost::lexical_cast<__int64>("3473472936");
Wenn Sie Boost nicht verwenden können, können Sie trotzdem eine einfache Version erstellen. Hier ist eine Implementierung, die ich für eine andere Antwort geschrieben habe:
template <typename R>
const R lexical_cast(const std::string& s)
{
std::stringstream ss(s);
R result;
if ((ss >> result).fail() || !(ss >> std::ws).eof())
{
throw std::bad_cast();
}
return result;
}
Es gibt ein paar Extras, wie z.B. die Überprüfung auf nachgestellte Zeichen. ( "123125asd"
scheitern würde). Wenn der Wurf nicht durchgeführt werden kann, bad_cast
geworfen wird. (Ähnlich wie bei Boost.)
Wenn Sie Zugang zu boost haben, können Sie außerdem die Verwendung der MSVC-spezifischen __int64
Verlängerung mit:
#include <boost/cstdint.hpp>
typedef boost::int64_t int64;
Um die int64
auf jeder Plattform, die dies anbietet, ohne Ihren Code zu ändern.