3

标题说明了这一点,看看我的最小示例:

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++ 中可以使用这种类型定义吗?

注意:我想这是重复的,但我真的无法在任何地方找到这个问题。

4

2 回答 2

11

是的,有可能。您应该使用std::remove_pointer来自type_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;};
于 2013-05-20T07:22:28.363 回答
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或提供您自己的实现(由竞争很快的答案提供,在 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;};
于 2013-05-20T07:22:27.720 回答