是否有标准库函数来检查字符串S是否为T类型,因此可以转换为T类型的变量?
我知道有一个istringstream STL类可以使用运算符>>,用一个从字符串转换的值填充T类型的变量。但是,如果字符串内容不具有类型T的格式,则将填充无意义。
答案 0 :(得分:6)
你可以做的最好是尝试失败,正如@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
基本上是一个更聪明的版本,声称效率非常高(可能比我们在这里无条件地使用iostream更多)。
答案 1 :(得分:2)
没有标准库功能。要查看它是否成功,您应该检查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
}