【问题标题】:Structure dereference operator (operator->)结构解引用运算符 (operator->)
【发布时间】:2012-01-22 06:22:08
【问题描述】:

我正在为迭代器编写一个瘦模板包装器,在通过结构取消引用运算符时遇到了一个绊脚石,主要是因为指针没有:

#include <vector>

struct mystruct {
    int member;
};

template<class iterator>
struct wrap {
   typedef typename std::iterator_traits<iterator>::pointer pointer;
   iterator internal;
   pointer operator->() {return internal.operator->();} //MARK1
};

int main() {
    wrap<std::vector<mystruct>::iterator> a;
    a->member;
    wrap<mystruct*> b;
    b->member;
    return 0;
}

http://ideone.com/XdvEz

prog.cpp: In member function ‘typename std::iterator_traits<_Iter>::pointer wrap<iterator>::operator->() [with iterator = mystruct*]’:
prog.cpp:18:   instantiated from here
prog.cpp:11: error: request for member ‘operator->’ in ‘((wrap<mystruct*>*)this)->wrap<mystruct*>::internal’, which is of non-class type ‘mystruct*’

以下方法有效,但我认为不能保证有效。也就是说,如果一个迭代器有一个奇怪的pointer 类型,它与指向value_type 的指针不同。

   pointer operator->() {return &*internal;} //MARK3

【问题讨论】:

  • 哪个版本的 C++ 有 结构取消引用运算符
  • 为什么是char*?某处不会有某种Iterator::value_type吗?
  • @ThomasMatthews:这就是wikipedia 所说的。 C++ 标准只是称之为operator-&gt;
  • 我不明白你想要返回什么 - 对对象的引用,或迭代器,或指向对象的指针?是的,不要写伪代码,而是最小的、有代表性的代码
  • 模板专业化不是正确的做法吗?

标签: c++ templates iterator operator-overloading


【解决方案1】:

该标准间接表示重载的operator-&gt; 必须返回一个指针、可转换为指针的对象或重载operator-&gt; 的对象。最好的办法是返回 internal

§13.5.6 [over.ref] p1

表达式x-&gt;m 被解释为(x.operator-&gt;())-&gt;m

(以上递归适用。)

【讨论】:

  • 在您询问operator*() 之前,返回类型为iterator_traits&lt;iterator&gt;::reference 并仅返回*iterator。任何在取消引用时不返回 reference 的迭代器都不能正确地模拟迭代器概念,可以忽略。
  • 是的,我收到了operator*,但我从未想过要返回iterator 而不是pointer。谢谢!我希望这是答案,但我会尽量给它一天左右的其他建议。
  • 我只想补充一点,当返回指针(或可转换为指针的对象)时,递归结束,所以如果 operator-> 返回指针,你就遇到了递归基本情况并且你'重做。如果 operator-> 使用 operator-> 重载返回其他内容,则递归。这可能看起来很明显,但我花了一段时间才解决。
猜你喜欢
  • 2013-06-19
  • 1970-01-01
  • 2012-11-22
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2019-03-22
相关资源
最近更新 更多