2013-05-25 66 views
8

是否有它返回基類型的給定類型的一個型性狀模板。由基類型我的意思是所有值修飾符類型,常量,易失性等剝離。例如,使用一個假設的性狀功能:獲取的模板類型的基本類型(除去常量/參考/等)

base<int>::type == int 
base<int const>::type == int 
base<int&>::type == int 

我所知道的remove_constremove_reference,我目前只是使用它們的組合。我想知道是否已經存在這樣的特徵,或者如果我指的是一個合適的名稱?

+2

'類型名稱的std :: remove_cv <類型名稱的std :: remove_reference ::類型> :: type'? –

+0

@AndyProwl,是的,這就是我現在所做的......我想這涵蓋了引用類型的所有方法。 –

回答

10

我會probaby定義類型的別名,如:

template<typename T> 
using base_type = typename std::remove_cv<typename std::remove_reference<T>::type>::type; 

通知書的,hereR. Martinho Fernandes提出的名稱Unqualified這種類型的別名。

標準型特點std::decay,在另一方面做同樣作爲上述更多的東西數組和函數類型,可能會或可能不是你想要的是。

+0

'不合格'與'std :: common_type'比較(我做了[測試](http://coliru.stacked-crooked.com/view?id=b36ef298b0537eb2841c01d881685e7a-8a676986784bd3a58ce3ec015645a41f)它,即使[兩個特徵](http://coliru.stacked-crooked.com/view?id=91fd0a114c9d0e6835133fb5062f01c8-8a676986784bd3a58ce3ec015645a41f))? – chris

+0

@chris:嗯,這很混亂。也許我錯過了一些東西,但是Standard沒有指定'common_type '只有一個類型參數時應該是'T'? –

+0

我知道它作爲一個身份模板,但從我所看到的,它所刪除的只是簡歷和引用。我不知道它是否對其他任何事情都這樣。 – chris

1

顯然,這取決於你想從類型中移除什麼。 std::decay可能是你正在尋找的東西(刪除引用,const/volatile,將數組衰減到指針和函數指針)。如果你不想數組指針和功能functionpointer衰變,你需要堅持std::remove_referencestd::remove_cv(刪除constvolatile)。當然,你可以將兩者結合到你自己的typetrait中,使它更容易使用。

4

嘗試std::decay。它模仿按值傳遞參數時發生的情況:去除頂層cv限定符,引用,將數組轉換爲指針和函數指針。

問候, & rzej