在C ++中,我可以从指针类型中键入一个元素类型吗?

时间:2013-05-20 07:17:47

标签: c++ c++11 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?
  3. 注意:我想这是重复的,但我真的无法在任何地方找到这个问题。

2 个答案:

答案 0 :(得分:11)

是的,有可能。您应该使用type_traits标题中的std::remove_pointer

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

在pre-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;};

答案 1 :(得分: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;};