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

发布于 12-03 01:50 字数 312 浏览 3 评论 0原文

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

例如,如果我有

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

,我怎样才能找出用什么来替换 ???

无提升!我想知道如何自己解决。)

How do I get the "dereferenced type" of another type in C++03? Note that it can be other dereferenceable type like std::vector<int>::iterator.

e.g. if I have

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

How can I figure out what to replace the ??? with?

(No Boost! I want to know how to figure it out myself.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

鯉魚旗2024-12-10 01:50:32
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; }
};
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; }
};
蓬勃野心2024-12-10 01:50:32

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

In the general case, you can't. For raw pointers, you can partially specialize as shown in other answers- custom smart pointers may have a common typedef for the result type. However, you cannot write a single function that will cope with any pointer in C++03.

等待圉鍢2024-12-10 01:50:32

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

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 ,也不会出现任何编译器错误。

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

You can have a simple construct which recursively removes all the pointers from a given type as below:

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

Below is the inline wrapper function to recursively find out the actual value from a given pointer or non-pointer types;

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); }

And just use it as:

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

In this example, it removes all the pointers from a given type, but as per the need you can configure the ActualType<> and ActualValue<>. There won't be any compiler error even if you declare MyPointer<> with a non-pointer type.

Here is a working demo for a single pointer and no pointer types.

救星2024-12-10 01:50:32

您可以这样做,并确保模板仅在您传递指针时才会编译:

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

You can do it like this, and it is ensured that the template will only compile when you pass pointers to it:

template<typename T>
struct MyPointer<T*>
{
    T* p;
    T operator*() { return *p; }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文