2011-06-15 85 views
8

在生產代碼中使用typeid通常被認爲是不好的做法嗎?另外,我注意到typeid返回type_info,其中包括一些元數據(如具有類型名稱的字符串);有沒有辦法停用這個?C++:在生產代碼中使用typeid

+3

您可能不想從庫調用中返回'typeid'引用。你最好寫一個函數來將'typeid'轉換爲別的東西,比如'int',在那裏控制映射。另外,不能保證'typeid'將從編譯器版本到版本保持不變。這也意味着你不想在磁盤上存儲'typeid',除非在運行之間沒有保存的緩存文件中。 – 2011-06-15 23:18:22

回答

8

很難說特定語言功能的使用是「壞」還是「好」。這真的取決於你如何使用它。如果使用typeid這個工具是正確的工具,但沒有任何內在的錯誤,但是如果對解決的任何問題有更好的解決方案,那麼您應該避免使用typeid來支持更好的解決方案。

使用typeid通常不是一個好主意,因爲通過使用繼承和虛函數可以避免它的使用。如果你能以這種方式更新你的系統,那麼這樣做可能是一個好主意。

至於你是否可以有typeid避免返回std::type_info,這應該不會導致任何性能問題。 typeid的計算結果爲const std::type_info&,因此它不會深度複製它包含的任何字符串信息。大多數實現都將對象的虛擬函數表中存儲的實際對象存儲在對象的虛擬函數表中,因此不會在內部完成複製。

11
  1. 取決於你在用typeid做什麼。如果你在使用多態的地方,那當然是不好的。但是,傾銷痕跡或類似的東西來調試客戶的機器就好了。
  2. 唯一的方法是在編譯器上禁用RTTI。沒有標準的做法。請注意,這也將禁用dynamic_cast