5

如何在 C++03 中获得另一种类型的“取消引用类型”?请注意,它可以是其他可取消引用的类型,例如std::vector<int>::iterator.

例如,如果我有

template<typename T>
struct MyPointer
{
    T p;
    ??? operator *() { return *p; }
};

我怎样才能弄清楚用什么代替???

没有提升!我想知道如何自己弄清楚。)

4

4 回答 4

11
template<typename>
struct dereference;

template<typename T>
struct dereference<T*>
{
    typedef typename T type;
};

template<typename T>
struct MyPointer
{
    T p;
    typename dereference<T>::type operator *() { return *p; }
};
于 2011-09-04T20:59:27.247 回答
2

在一般情况下,你不能。对于原始指针,您可以部分专门化,如其他答案所示 - 自定义智能指针可能具有结果类型的通用 typedef。但是,您不能编写一个函数来处理 C++03 中的任何指针。

于 2011-09-04T21:20:03.213 回答
1

您可以有一个简单的构造,它递归地从给定类型中删除所有指针,如下所示:

template<typename T>
struct ActualType { typedef T type; };
template<typename T>
struct ActualType<T*> { typedef typename ActualType<T>::type type; };

下面是内联包装函数,用于递归地从给定指针或非指针类型中找出实际值;

template<typename T>
typename ActualType<T>::type ActualValue (const T &obj) { return obj; }
template<typename T>
typename ActualType<T>::type ActualValue (T *p) { return ActualValue(*p); }

并将其用作:

template<typename T>
struct MyPointer
{
  T p;
  typename ActualType<T>::type operator *() { return ActualValue(p); }
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^                       ^^^^^^^^^^^^^^
};

在此示例中,它从给定类型中删除所有指针,但您可以根据需要配置ActualType<>and ActualValue<>MyPointer<>即使您使用非指针类型声明也不会有任何编译器错误。

这是一个单指针和无指针类型的工作演示

于 2013-01-23T03:12:33.027 回答
0

您可以这样做,并确保模板只有在您将指针传递给它时才会编译:

template<typename T>
struct MyPointer<T*>
{
    T* p;
    T operator*() { return *p; }
}
于 2011-09-04T21:00:24.483 回答