2011-11-29 101 views
4

所以我有一个智能迭代器模拟一个映射const_iterator,它需要在内部构建返回类型。显然,我想在我的迭代器类中存储一个pair<Key, Value>(因为我需要修改它),但同时我希望取消引用函数提供pair<const Key, Value>(实际上它将分别为const pair<const Key, Value>&const pair<const Key, Value>*) 。我到目前为止提出的唯一解决方案是每次更改我的迭代器类指向的值更改时动态分配一对新对。不用说,这不是一个好的解决方案。是否可以将一对<Key, Value>转换成一对<const Key,Value>?

我也试过*const_cast<const pair<const Key, Value> >(&value)其中value被宣布为pair<Key, Value>

任何帮助将不胜感激(如知识,它不能做)。

编辑

对于好奇:我结束了我的迭代器类存储pair<const Key, Value> p。为了改变对我改变分别基于底层迭代器(map<Key, Value>::const_iterator it),荷兰国际集团const_cast关键的两个要素,以便它可以改变,就像这样:

*const_cast<Key*>(&p.first) = it->first; 
p.second = it->second; 

没办法了,我非常高兴与,但它完成了工作,并且取消引用方法很开心,因为我存储了可以引用的正确类型的东西。

+3

您有问题吗? –

+5

很难相信你会付出如此巨大的努力来发表这篇小文章,甚至不尝试**:'std :: pair p(1,2); std :: pair q = p; //很好' –

+2

@ Kerrek SB:我认为你忽略了Op的问题的一个重要部分。他希望避免每次调用自定义迭代器的解除引用/成员选择操作符时构造一个新的对象。这在operator->中变得尤为重要,因为这意味着他的迭代器必须潜在地存储成员对并在每次函数被调用或迭代器递增/递减时复制到成员对。 – stinky472

回答

6

可以pair<Key,Value>类型的转换为pair<const Key,Value>

然而,仔细阅读问题,你实际上是在问,给予pair<Key,Value>你可以创建一个指针参考pair<const Key,Value>指的是同一个对象。

答案是否定的 - 唯一的情况是引用或指向一种类型的指针可以引用不同类型的对象,如果对象类型继承自引用类型。

一种可能性是返回一对引用,pair<const Key&, Value&>,根据您希望引用的对创建。

+0

谢谢,我会看看如果参考配对解决方案能够解决我的特殊问题(并且非常感谢您的仔细阅读,我会在未来尝试更加清楚地表达自己)。 – masaers

5

是的。

std::pair<int, double> p(1,2); 
std::pair<const int, double> q = p; // no problem 

//q.first = 8; // error 
q.second = 9; 

int b; double d; 
std::pair<int &, double &> s(b,d); 
std::pair<int const &, double &> t = s; // also fine 
+0

在我的特殊情况下,这会导致返回一个临时对象的引用的情况,该对象无法编译。 – masaers

+1

@MarkusSaers:给定你的'pair p',你可以返回一个'pair (p.first,p.second)',它不会创建任何临时对象。 –

2

正如Kerrek SB所指出的那样,您可以从std::pair<Key, Value>构建std::pair<const Key, Value>。但是,您的原始问题意味着您希望避免在每次迭代器被解除引用时构建std :: pair对象。

不幸的是,没有一个好的方法来做到这一点。您可能必须构建pair对象并将其存储在某处,特别是operator->。否则,您必须能够让您的地图实际存储pair<const Key, Value>以便能够从您的迭代器中返回它的引用/指针。基本上返回一个引用/指针,它必须存储在表单的某个地方:它不能是临时的。

避免const_cast。这只是要求您在使用这种方式进行配对时未定义的行为,尽管它可能经常使用。

0

我遇到了完全相同的问题。我的解决方案是创建一个新的地图对象作为迭代器类的一部分,然后添加到上游地图类中错过的成员并将引用返回给它的成员。效率不高,但有效。

您的解决方案有两个问题:

  1. 分配一个const变量,const_cast会是不确定的行为。编译器优化可能会提供奇怪的结果。
  2. 任何新的解除引用都会使先前解除引用的结果无效。它不应该。所以,根据你的迭代器的用法,它也可能产生奇怪的结果。
+0

但是在我的情况下,没有上游映射对象(这是一个自定义容器类,它不包含可以引用的std :: pair 元素 – masaers

+0

但是,您可以创建内部临时std ::在每一个迭代器的解引用上以一种或另一种方式配对元素,并在迭代器实例销毁时销毁它们。 – Denis

相关问题