2013-03-02 95 views
1

要將一個對象寫入命令行(或其他輸出流),可能會過載運算符<<。但有沒有可能實現這個模板? 假設我有以下幾點:模板類的標準流輸出

template <typename identifier> 
class SomeTemplate { 
public: 
    SomeTemplate(); 
    ~SomeTemplate(); 
    void addElement(identifier id, unsigned int elem); 
    unsigend int getElement(identifier id); 
private: 
    std::map<identifier, unsigned int> data_map_; 
}; 

當我現在專門的類如類型std::tuple<unsigned int, unsigned int, unsigned int>的標識符功能getElement(identifier id)應執行一致性檢查並在中寫入警告,以防data_map_中所請求的元素不存在。 簡單地將id傳遞給cout不起作用,因爲對於用於專業化的類型,可能沒有超載的<<運算符。 還有其他的可能性嗎?也許它可能標識符必須實現一個純虛擬類,它強制所有標識符超載運算符。但是這可能嗎?

感謝您的幫助。

問候

+2

你**可以簡單地執行'cout << id',因爲在沒有適當的過載的情況下,你會得到一個編譯器錯誤。 – 2013-03-02 12:13:59

回答

3

通常的事是簡單地指出,具有流輸出操作符是用於identifier類型的先決條件。這肯定更多的是使用模板的通用C++編程精神,而不是使用純虛擬方法打印的基類。

如果您需要,也許您可​​以使用SFINAE打印一個簡單的「不可用」消息,如果沒有特定類型的流輸出操作符。

1

你的第一個問題「是否有任何可能[超載運營商< <]模板」?當然...

template <typename identifier> 
std::ostream& operator<<(std::ostream& out, SomeTemplate<identifier> const& rhs); 

該聲明的定義將工作得很好。

但是,你真正要問的是,我可以流std::tuple?答案似乎是否定的。當然,你可以爲它編寫一個本地的operator<<,但不要將它暴露太多。