如何在C ++ 03中“取消引用类型”?

时间:2011-09-04 20:51:40

标签: c++ templates traits template-meta-programming c++03

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

e.g。如果我有

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

如何确定用???替换的内容?

No Boost !我想知道如何自己解决这个问题。)

4 个答案:

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

答案 1 :(得分:2)

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

答案 2 :(得分: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<>ActualValue<>。即使您使用非指针类型声明MyPointer<>,也不会有任何编译器错误。

这是一个工作demo,用于单个指针,没有指针类型。

答案 3 :(得分:0)

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

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