2011-12-09 61 views
3

我正在尋找將字符串轉換爲int的最佳方法,並且遇到了一個我不明白的函數:是什麼意思:'std :: ios_base&(* f)(std :: ios_base&))'

template <class T> 
bool from_string(T& t, 
       const std::string& s, 
       std::ios_base& (*f)(std::ios_base&)) 
{ 
    std::istringstream iss(s); 
    return !(iss >> f >> t).fail(); 
} 

我知道什麼是模板,我不知道這意味着什麼:

std::ios_base& (*f)(std::ios_base&) 

這裏是正在創建一個新的指針,爲什麼有彼此相鄰的括號中2倍的表達?

回答

5

這是一個函數指針,它將std::ios_base&作爲參數 ,並返回std::ios_base&

事實上,它是一種不採用任何 參數的操縱器形式。該類型的<<重載只是簡單地調用該函數;該函數然後在流上做任何它喜歡的事情,然後返回它。 您的功能因此可以通過類似如下方式調用:

from_string(anInt, "0A", &std::hex); 
+0

+1用於識別ostream操縱器簽名。解密函數簽名很容易,但是沒有其他人似乎理解特定的語義:) –

+0

@MatthieuM:「+1」James對於識別iostream操縱器幾乎是一種攻擊。 :-)可怕的是,其他三位回答的人沒有認出來。我認爲人們至少應該知道一個人使用的工作的一般方式。乾杯, –

+0

順便說一句,你能告訴我一些事情,如果這個函數返回布爾值,爲什麼實際轉換髮生?它在最後說'return!(iss >> f >> t).fail()'。我在這裏閱讀(雖然我知道一些人說,這個網站'錯過了')http://www.cplusplus.com/reference/iostream/ios/fail/'失敗'函數只返回true或false,如果被檢查的語句是真的或者類似的話,它不會執行任何命令。 ADDED:嗯,也許這個轉換是事先執行的,並且由於參數是通過引用傳遞的,所以它們可以在以後使用 – user1042840

2

這是一個指針f到一個函數的聲明,該函數正在使用std::ios_base&並返回std::ios_base&

1

它是一個名爲f的函數指針,返回std::ios_base&並接受std::ios_base&作爲其單個參數。

相關問題