2012-03-24 34 views
9

有沒有辦法用一些C++ 11或最多一個boost庫來做到這一點?標準C++ 11種方法去除一個類型的所有指針

#include <iostream> 
#include <typeinfo> 
using namespace std; 

template <typename T> class remove_all_pointers{ 
public: 
    typedef T type; 
}; 

template <typename T> class remove_all_pointers<T*>{ 
public: 
    typedef typename remove_all_pointers<T>::type type; 
}; 

int main(){ 
    //correctly prints 'i' on gcc 
    cout<<typeid(remove_all_pointers<int****>::type).name()<<endl; 
} 
+0

你想從中刪除這些指針? – Gabe 2012-03-24 12:08:50

+0

類,基本類型,一切。 – 2012-03-24 12:09:41

+0

你需要什麼? – 2012-03-24 14:03:55

回答

2

Boost和C++ 11都沒有這樣的特徵模板。但是你的代碼應該工作。

5

這並不適用於所有指針類型。你需要考慮到不同的CV-預選賽還有:

template <typename T> class remove_all_pointers<T* const>{ 
public: 
    typedef typename remove_all_pointers<T>::type type; 
}; 

template <typename T> class remove_all_pointers<T* volatile>{ 
public: 
    typedef typename remove_all_pointers<T>::type type; 
}; 

template <typename T> class remove_all_pointers<T* const volatile >{ 
public: 
    typedef typename remove_all_pointers<T>::type type; 
}; 
+0

好點。你可以使用std:remove_cv並派遣到一個做海報的例程。 – emsr 2012-03-25 00:46:25

1

用C++ 17可讀,簡單和CV-預選賽意識到元函數爲:

#include <type_traits> 

// unfortunately there's no std::identity anymore in C++17 
template <typename T> 
struct identity 
{ 
    using type = T; 
}; 

template<typename T> 
struct remove_all_pointers : std::conditional_t< 
    std::is_pointer_v<T>, 
    remove_all_pointers< 
     std::remove_pointer_t<T> 
    >, 
    identity<T> 
> 
{}; 

template<typename T> 
using remove_all_pointers_t = typename remove_all_pointers<T>::type; 

然後使用它像:

int main() 
{ 
    remove_all_pointers_t<int* const* volatile* const volatile*> v = 42; 
    return 0; 
} 
相關問題