2013-02-19 62 views
1

我遇到困難的類型,如:遞歸std :: remove_pointer?

T****************************************** 

應該std::remove_pointer能夠在所有處理這種類型的(我不這麼認爲)?如何清除所有*?如果在末尾添加了一個符號&或兩個,則是否存在C++11標準中的元函數,可以將這種類型刪除爲T而不使用std::remove_referencestd::remove_pointer元函數?

+0

爲什麼會存在這樣的標準呢?多久進行一次這種轉變有用?我想不出什麼時候它會有用,'T *'和'T **********'幾乎沒有共同之處,它們不指向相同的類型,爲什麼它有用從他們那裏提取'T'? – 2013-02-19 16:34:12

+0

@JonathanWakely即使提供了'T **********',我也需要這個來實例化T。我不知道爲什麼它會存在於標準中,但是如果有的話,我會使用標準中的元函數。 – user1095108 2013-02-19 17:55:10

回答

10

不管你有多少個* s和&,編寫一個返回基類型的元函數並不難。

template <typename T> 
struct remove_all_ref_ptr { typedef T type; }; 

template <typename T> 
struct remove_all_ref_ptr<T *> : public remove_all_ref_ptr<T> { }; 

template <typename T> 
struct remove_all_ref_ptr<T * const> : public remove_all_ref_ptr<T> { }; 

template <typename T> 
struct remove_all_ref_ptr<T * volatile> : public remove_all_ref_ptr<T> { }; 

template <typename T> 
struct remove_all_ref_ptr<T * const volatile> : public remove_all_ref_ptr<T> { }; 

template <typename T> 
struct remove_all_ref_ptr<T &> : public remove_all_ref_ptr<T> { }; 

template <typename T> 
struct remove_all_ref_ptr<T &&> : public remove_all_ref_ptr<T> { }; 

::std::remove_pointer可以處理這樣的類型就好了。它只是單一的*

我剛剛寫的小元函數最終會遇到遞歸深度限制。但是你可能需要穿上一百多個才能實現這一點。

這裏是您可以如何結合使用一個標準庫的元函數刪除了const和volatile限定符以及:

#include <type_traits> 

template <typename T> 
struct base_type : public ::std::remove_cv<typename remove_all_ref_ptr<T>::type> { }; 
+2

不應該'typedef'是'public'還是'class'變成'struct'? – user1095108 2013-02-19 07:57:21

+0

@ user1095108:你說得對。我的編譯器(g ++ 4.7.2)讓我失望了。 :-) – Omnifarious 2013-02-19 08:07:17

+0

我想這個元函數可以很容易地改善剝離'cv'也? – user1095108 2013-02-19 08:43:38