2011-11-07 54 views

回答

0

您可以:

  • 嘗試的dynamic_cast <>到你感興趣的可能的流類型,看看哪些成功
  • 使用typeid的,並比較已知類型
  • 的要求模板的用戶傳遞一個額外的參數說流類型是什麼
  • 爲需要不同的處理流特定類型提供模板特

但是,所有這些都是限制 - 它們都需要你瞭解不同的流類型,如果你需要在你的模板類中進行特殊處理,你可能會發現另一個需要添加另一個。理想情況下,模板應該比這更普遍。

由於標準庫中的流類都來自共同的祖先,所以另一種選擇是不使用模板,而是在提供所需功能和依賴多態性的級別接受指向或指向祖先類型的指針或引用。同樣,如果需要,這可以爲使用重載的特定類型提供專門的功能。

+0

一些編譯器也有可能被使用的'typeid'關鍵字。 –

+0

其他方式:'typeid'是標準的,'typeof'是一個擴展。我無法分辨約阿希姆是否發現了這件事,並且正在滔滔不絕... –

+0

Woops,你是對的。太多的C#。糾正了這一點。 –

1

模板是編譯時施工,所以沒有什麼做的「在運行時」。但這更好。可能最慣用的方式是使用char_traits

template <typename TChar, typename Traits> 
void foo(std::basic_ostream<TChar, Traits> & o) 
{ 
    // use `Traits` in here 
    // e.g. Traits::char_type 
}