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

我知道有一个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基本上是此版本的一个巧妙的版本,它声称非常有效(可能比我们在此无条件地使用iostream还要有效)。

    10-04 11:55