如何在 C++03 中获得另一种类型的“取消引用类型”?请注意,它可以是其他可取消引用的类型,例如std::vector<int>::iterator
.
例如,如果我有
template<typename T>
struct MyPointer
{
T p;
??? operator *() { return *p; }
};
我怎样才能弄清楚用什么代替???
?
(没有提升!我想知道如何自己弄清楚。)
如何在 C++03 中获得另一种类型的“取消引用类型”?请注意,它可以是其他可取消引用的类型,例如std::vector<int>::iterator
.
例如,如果我有
template<typename T>
struct MyPointer
{
T p;
??? operator *() { return *p; }
};
我怎样才能弄清楚用什么代替???
?
(没有提升!我想知道如何自己弄清楚。)
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; }
};
在一般情况下,你不能。对于原始指针,您可以部分专门化,如其他答案所示 - 自定义智能指针可能具有结果类型的通用 typedef。但是,您不能编写一个函数来处理 C++03 中的任何指针。
您可以有一个简单的构造,它递归地从给定类型中删除所有指针,如下所示:
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<>
即使您使用非指针类型声明也不会有任何编译器错误。
这是一个单指针和无指针类型的工作演示。
您可以这样做,并确保模板只有在您将指针传递给它时才会编译:
template<typename T>
struct MyPointer<T*>
{
T* p;
T operator*() { return *p; }
}