2014-11-22 64 views
3

C++ 11是否提供縮短長整型模板類名(std ::以及我自己的類型)的方法?C++ 11模板類型別名,以減輕疼痛

這將減少解密和漂亮打印消息的痛苦。我想定義自定義別名,以替換擴展的模板類型名稱,並使用唯一且明確定義的替代方法。

利用typedefusing沒有幫助,因爲編譯器和gdb仍將打印完整的類型名稱。對於stl以及自定義模板類型,應該可以使用別名。理想情況下,gccclanggdb應該使用自定義名稱。

回答

1

在某些情況下,我通過繼承替換了usingtypedef以減輕痛苦;例如代替using MyType = MyTemplate<MyTraits<Blah>>做的MyType

struct MyType : MyTemplate<MyTraits<Blah>> 
{ 
    // possibly some stuff 
}; 

用途在後者的情況下將是公正的,其中作爲一種類型的別名(usingtypedef)編譯器和調試程序將打印出長的複雜類型,有時可少信息量,而在後一種情況下,它將只打印MyType。因爲現在已經引入了遺產,所以美國政府就是這樣做的。

+0

不會導致關於虛擬析構函數的編譯器警告嗎? – 2014-11-22 06:53:13

+0

@mic_e,只有當你使用'-Wnon-virtual-dtor'或者有深度瑕疵的'-WeffC++'選項。不要這樣做。 '-Wdelete-non-virtual-dtor'在幾乎所有方面都比較好,並且由'-Wall'啓用。 – 2014-11-22 18:54:20

+0

我主要在泛型編程中使用它,這些複雜的簽名在黑桃中出現。在這些情況下沒有虛擬功能。 – sfjac 2014-11-22 22:15:32

3

不,這種語言本身沒有辦法改變工具如何顯示名字,這超出了標準的範圍,並且不一致地被不同的工具處理。

GCC有一個-fno-pretty-templates選項,用於調整模板專業化在診斷中的顯示方式。

你可以在Python中定義Type Printers告訴GDB如何打印你的類型。我已經爲libstdC++寫了一些,這樣GDB將打印std::vector<X>而不是std::vector<X, std::allocator<X> >。它不影響編譯器診斷中顯示的類型,僅在GDB中。