如何在C ++ 03中获得另一种类型的“解除引用类型”?请注意,它可以是其他可解除引用的类型,如std::vector<int>::iterator
。
e.g。如果我有
template<typename T>
struct MyPointer
{
T p;
??? operator *() { return *p; }
};
如何确定用???
替换的内容?
( No Boost !我想知道如何自己解决这个问题。)
答案 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; }
}