C++ 11是否提供縮短長整型模板類名(std ::以及我自己的類型)的方法?C++ 11模板類型別名,以減輕疼痛
這將減少解密和漂亮打印消息的痛苦。我想定義自定義別名,以替換擴展的模板類型名稱,並使用唯一且明確定義的替代方法。
利用typedef
或using
沒有幫助,因爲編譯器和gdb
仍將打印完整的類型名稱。對於stl
以及自定義模板類型,應該可以使用別名。理想情況下,gcc
,clang
和gdb
應該使用自定義名稱。
C++ 11是否提供縮短長整型模板類名(std ::以及我自己的類型)的方法?C++ 11模板類型別名,以減輕疼痛
這將減少解密和漂亮打印消息的痛苦。我想定義自定義別名,以替換擴展的模板類型名稱,並使用唯一且明確定義的替代方法。
利用typedef
或using
沒有幫助,因爲編譯器和gdb
仍將打印完整的類型名稱。對於stl
以及自定義模板類型,應該可以使用別名。理想情況下,gcc
,clang
和gdb
應該使用自定義名稱。
在某些情況下,我通過繼承替換了using
或typedef
以減輕痛苦;例如代替using MyType = MyTemplate<MyTraits<Blah>>
做的MyType
struct MyType : MyTemplate<MyTraits<Blah>>
{
// possibly some stuff
};
用途在後者的情況下將是公正的,其中作爲一種類型的別名(using
或typedef
)編譯器和調試程序將打印出長的複雜類型,有時可少信息量,而在後一種情況下,它將只打印MyType
。因爲現在已經引入了遺產,所以美國政府就是這樣做的。
不,這種語言本身沒有辦法改變工具如何顯示名字,這超出了標準的範圍,並且不一致地被不同的工具處理。
GCC有一個-fno-pretty-templates
選項,用於調整模板專業化在診斷中的顯示方式。
你可以在Python中定義Type Printers告訴GDB如何打印你的類型。我已經爲libstdC++寫了一些,這樣GDB將打印std::vector<X>
而不是std::vector<X, std::allocator<X> >
。它不影響編譯器診斷中顯示的類型,僅在GDB中。
不會導致關於虛擬析構函數的編譯器警告嗎? – 2014-11-22 06:53:13
@mic_e,只有當你使用'-Wnon-virtual-dtor'或者有深度瑕疵的'-WeffC++'選項。不要這樣做。 '-Wdelete-non-virtual-dtor'在幾乎所有方面都比較好,並且由'-Wall'啓用。 – 2014-11-22 18:54:20
我主要在泛型編程中使用它,這些複雜的簽名在黑桃中出現。在這些情況下沒有虛擬功能。 – sfjac 2014-11-22 22:15:32