1

是否有标准库函数来检查字符串 S 是否属于 T 类型,因此可以转换为 T 类型的变量?

我知道有一个 istringstream STL 类,它可以使用 operator>> 用从字符串转换的值填充 T 类型的变量。但是,如果字符串内容不是 T 类型的格式,它将被无意义地填充。

4

2 回答 2

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基本上是一个更聪明的版本,它声称非常有效(可能比我们在这里所做的无条件使用 iostreams 更有效)。

于 2012-10-07T20:31:12.500 回答
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
}
于 2012-10-07T20:29:56.917 回答