我遇到困難的類型,如:遞歸std :: remove_pointer?
T******************************************
應該std::remove_pointer
能夠在所有處理這種類型的(我不這麼認爲)?如何清除所有*
?如果在末尾添加了一個符號&
或兩個,則是否存在C++11
標準中的元函數,可以將這種類型刪除爲T
而不使用std::remove_reference
和std::remove_pointer
元函數?
我遇到困難的類型,如:遞歸std :: remove_pointer?
T******************************************
應該std::remove_pointer
能夠在所有處理這種類型的(我不這麼認爲)?如何清除所有*
?如果在末尾添加了一個符號&
或兩個,則是否存在C++11
標準中的元函數,可以將這種類型刪除爲T
而不使用std::remove_reference
和std::remove_pointer
元函數?
不管你有多少個*
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> { };
不應該'typedef'是'public'還是'class'變成'struct'? – user1095108 2013-02-19 07:57:21
@ user1095108:你說得對。我的編譯器(g ++ 4.7.2)讓我失望了。 :-) – Omnifarious 2013-02-19 08:07:17
我想這個元函數可以很容易地改善剝離'cv'也? – user1095108 2013-02-19 08:43:38
爲什麼會存在這樣的標準呢?多久進行一次這種轉變有用?我想不出什麼時候它會有用,'T *'和'T **********'幾乎沒有共同之處,它們不指向相同的類型,爲什麼它有用從他們那裏提取'T'? – 2013-02-19 16:34:12
@JonathanWakely即使提供了'T **********',我也需要這個來實例化T。我不知道爲什麼它會存在於標準中,但是如果有的話,我會使用標準中的元函數。 – user1095108 2013-02-19 17:55:10