2011-12-25 48 views
7

代碼使用從lexical_cast片段:啓用類與升壓:: lexical_cast的

class lexical_castable { 
public: 
    lexical_castable() {}; 
    lexical_castable(const std::string s) : s_(s) {}; 

    friend std::ostream operator<< 
    (std::ostream& o, const lexical_castable& le); 
    friend std::istream operator>> 
    (std::istream& i, lexical_castable& le); 

private: 
    virtual void print_(std::ostream& o) const { 
    o << s_ <<"\n"; 
    } 

    virtual void read_(std::istream& i) const { 
    i >> s_; 
    } 

    std::string s_; 
}; 

std::ostream operator<<(std::ostream& o, 
    const lexical_castable& le) { 
    le.print_(o); 
    return o; 
} 

std::istream operator>>(std::istream& i, lexical_castable& le) { 
    le.read_(i); 
    return i; 
} 

基於document

template<typename Target, typename Source> 
    Target lexical_cast(const Source& arg); 

1>返回流ARG成一個標準庫 的結果基於字符串的流,然後作爲目標對象輸出。

2>源是OutputStreamable

3>目標是InputStreamable

問題1>對於用戶定義類型(UDT),如果OutputStreamable或InputStreamable總是必須處理std::string?例如,給定一個包含簡單整數作爲成員變量的類,當我們定義operator<<operator>>時,實現代碼的外觀如何?我必須將整數轉換爲字符串嗎?根據我的理解,似乎UDT總是必須處理std::string以便與boost::lexical_cast配合工作,而boost::lexcial_cast需要中間std::string來完成真正的轉換工作。

問題2>爲什麼的operator<<在上面的代碼的返回值或operator>>並不分別參考std::ostream&std::istream&或?

+0

代碼不返回引用很可能是一個錯誤,因爲流不可複製。 – Xeo 2011-12-25 16:34:24

+0

這是一個'lexical_castable :: read_'是一個const成員函數的錯誤 – q0987 2011-12-25 16:47:25

+0

這是一個'lexical_castable :: print'包含'\ n'的錯誤。 – q0987 2011-12-25 18:57:15

回答

7

爲了讓您的課程可以使用lexical_cast,只需爲其定義「流」操作符即可。 從Boost.LexicalCast Synopsis

  • 源是OutputStreamable的,這意味着一個operator<<定義了發生在左手側上的std::ostreamstd::wostream對象和參數類型的實例在右邊。
  • 目標是InputStreamable的,這意味着一個operator>>定義了發生在左手側上的std::istreamstd::wistream對象,在右側的結果類型的一個實例。
  • 目標是CopyConstructible [20.1.3]。
  • 目標是DefaultConstructible,這意味着可以默認初始化該類型的對象[8.5,20.1.4]。

// either inline friend, out-of-class friend, or just normal free function 
// depending on whether it needs to access internel members 
// or can cope with the public interface 
// (use only one version) 
class MyClass{ 
    int _i; 
public: 
    // inline version 
    friend std::ostream& operator<<(std::ostream& os, MyClass const& ms){ 
    return os << ms._i; 
    } 

    // or out-of-class friend (friend declaration inside class only) 
    friend std::ostream& operator<<(std::ostream& os, MyClass const& ms); 

    // for the free function version 
    int get_i() const{ return _i; } 
}; 

// out-of-class continued 
std::ostream& operator<<(std::ostream& os, MyClass const& ms){ 
    return os << ms._i; 
} 

// free function, non-friend 
std::ostream& operator<<(std::ostream& os, MyClass const& ms){ 
    return os << ms.get_i(); 
} 

相同的課程爲operator>>

+0

該操作系統詢問如何處理某些類型的lexical_cast,而不需要中間的字符串流**。 – Kos 2011-12-25 17:09:00

+0

@Kos:OP問他是否必須一直使用**串**。 – Xeo 2011-12-25 20:44:50