是否有標準庫函數來檢查字符串S是否爲T類型,因此可以將其轉換爲類型T的變量?檢查字符串是否屬於T類型C++ 11
我知道存在istringstream STL類,它可以使用運算符>>來填充T類型的變量,並使用從字符串轉換而來的值。但是,如果字符串內容不具有類型T的格式,它將被填充爲無意義。
是否有標準庫函數來檢查字符串S是否爲T類型,因此可以將其轉換爲類型T的變量?檢查字符串是否屬於T類型C++ 11
我知道存在istringstream STL類,它可以使用運算符>>來填充T類型的變量,並使用從字符串轉換而來的值。但是,如果字符串內容不具有類型T的格式,它將被填充爲無意義。
你能做的就是嘗試和失敗,因爲@Cameron評論最好:
#include <string>
#include <sstream>
#include <boost/optional.hpp>
template <typename T>
boost::optional<T> convert(std::string const & s)
{
T x;
std::istringstream iss(s);
if (iss >> x >> std::ws && iss.get() == EOF) { return x; }
return boost::none;
}
,或在不提升:
template <typename T>
bool convert(std::string const & s, T & x)
{
std::istringstream iss(s);
return iss >> x >> std::ws && iss.get() == EOF;
}
用法:
第一版本:
if (auto x = convert<int>(s))
{
std::cout << "Read value: " << x.get() << std::endl;
}
else
{
std::cout << "Invalid string\n";
}
第二個版本:
{
int x;
if (convert<int>(s, x))
{
std::cout << "Read value: " << x << std::endl;
}
else
{
std::cout << "Invalid string\n";
}
}
注意boost::lexical_cast
基本上是這樣一個聰明版本,其聲稱是非常有效的(潛在moreso比使用輸入輸出流無條件正如我們在這裏所做的)。
沒有標準庫函數。看它是否是成功的,你應該檢查從operator>>
返回:
std::istringstream iss(mystring);
// if you want trailing whitespace to be invalid, remove std::ws
if((iss >> myT >> std::ws) && iss.eof())
{
// success
}
else
{
// failed
}
'如果字符串內容不具有類型T的格式,它將被無意義填充。這是因爲它是未初始化的。 –
字符串沒有類型。你可以做的最好的事情是猜測,使用類似['boost :: lexical_cast'](http://www.boost.org/doc/libs/1_51_0/doc/html/boost_lexical_cast.html) – Cameron