1

文字列SがタイプTであり、したがってタイプTの変数に変換できることを確認するための標準ライブラリ関数はありますか?

演算子>>を使用して、T型の変数に文字列から変換された値を入力できるistringstreamSTLクラスがあることを知っています。ただし、文字列の内容がタイプ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";
    }
    
  • 2番目のバージョン:

    {
        int x;
        if (convert<int>(s, x))
        {
            std::cout << "Read value: " << x << std::endl;
        }
        else
        {
            std::cout << "Invalid string\n";
        }
    }
    

これboost::lexical_castは基本的にこれの賢いバージョンであり、非常に効率的であると主張していることに注意してください(ここで行ったように無条件にiostreamを使用するよりも可能性があります)。

于 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 に答える