2012-10-07 52 views
1

是否有標準庫函數來檢查字符串S是否爲T類型,因此可以將其轉換爲類型T的變量?檢查字符串是否屬於T類型C++ 11

我知道存在istringstream STL類,它可以使用運算符>>來填充T類型的變量,並使用從字符串轉換而來的值。但是,如果字符串內容不具有類型T的格式,它將被填充爲無意義。

+0

'如果字符串內容不具有類型T的格式,它將被無意義填充。這是因爲它是未初始化的。 –

+1

字符串沒有類型。你可以做的最好的事情是猜測,使用類似['boost :: lexical_cast'](http://www.boost.org/doc/libs/1_51_0/doc/html/boost_lexical_cast.html) – Cameron

回答

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基本上是這樣一個聰明版本,其聲稱是非常有效的(潛在moreso比使用輸入輸出流無條件正如我們在這裏所做的)。

+0

簡潔和正確。我懷疑OP沒有進一步的解釋就會理解(特別是後者,如果你沒有仔細閱讀,看起來......太微不足道了)) – sehe

+0

這將成功地將字符串「123abc」轉換爲「int」,這是通常不是人們所期望的。 – interjay

+0

@interjay:好點,固定。 –

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 
} 
+0

我認爲流轉換如果他們沒問題,那麼就是「真」。 – cubuspl42

+0

@ cubuspl42:是的,你是對的。 –

+0

這將失敗的尾隨空白字符串(可能是OP想要的)。 – jrok

相關問題