2013-05-20 35 views
3

標題說明了,看我的小例子:在C++中,我可以用指針類型typedef一個元素類型嗎?

template<class ptr_to_t> 
void f(ptr_to_t x) { 
    typedef ptr_to_t t; // does not compile 
    t elem = *x; 
} 

int main() 
{ 
    int five = 5; 
    f<int*>(&five); 
    return 0; 
} 

編譯如下:

g++ -Wall typedef.cpp -o typedef 

這並不編譯。我想要的是改變標記線(第3行),使t的類型爲int(在此實例中)。

  1. 在C++ 11中是否有這樣的typedef?
  2. 在「舊」C++中可以使用這種typedef嗎?

注:我想這是重複的,但我真的找不到這個問題的任何地方。

+2

「在C++或C++ 11「 - 所以我想C++ 11不是C++? – 2013-05-20 07:19:00

回答

11

是的,這是可能的。您應該使用std::remove_pointertype_traits頭:

typedef typename std::remove_pointer<ptr_to_t>::type t; 

在預C++ 11你可以寫自己的實現(如上面的鏈接,例如):

template< class T > struct remove_pointer     {typedef T type;}; 
template< class T > struct remove_pointer<T*>    {typedef T type;}; 
template< class T > struct remove_pointer<T* const>   {typedef T type;}; 
template< class T > struct remove_pointer<T* volatile>  {typedef T type;}; 
template< class T > struct remove_pointer<T* const volatile> {typedef T type;}; 
+0

這完全回答我的問題,謝謝! – Johannes

5

您應該使用C++ 11 std::remove_pointer

#include <type_traits> 

template<class ptr_to_t> 
void f(ptr_to_t x) { 
    typedef ptr_to_t t; // does not compile 
    typename std::remove_pointer<t>::type elem = *x; 
} 

int main() 
{ 
    int five = 5; 
    f<int*>(&five); 
    return 0; 
} 

(在IdeOne編譯)

如果針對C++ 03,可以使用boost::remove_pointer代替或提供自己的(禮貌競爭很快的回答,compiled in IdeOne):

template< class T > struct remove_pointer     {typedef T type;}; 
template< class T > struct remove_pointer<T*>    {typedef T type;}; 
template< class T > struct remove_pointer<T* const>   {typedef T type;}; 
template< class T > struct remove_pointer<T* volatile>  {typedef T type;}; 
template< class T > struct remove_pointer<T* const volatile> {typedef T type;}; 
相關問題