自定义迭代器,在保存之前转换值

时间:2010-05-19 08:55:54

标签: c++ iterator

一个典型的前向迭代器应该实现以下方法:

value_type& operator*();
value_type* operator->();

我正在为自定义容器编写自定义迭代器,用户希望看到value_type与容器内值的表示不同。因此,当向用户返回value_type值时,我将其从内部表示转换为用户期望的value_type。内部成员很容易实现。

你能建议如何处理l值吗?当用户使用value_type等语法为迭代器赋值时,我在哪里可以处理*it = value_type(5)到内部表示的转换?

我想回到一个仿函数但我不喜欢这个想法,因为呼叫者的语法不常见。

2 个答案:

答案 0 :(得分:3)

如果您要返回引用,那么除非存储转换后的值,否则无法转换并返回引用,此时我开始质疑内部表示的点。我不确定你想要的是否可能。一个例子是vector<bool>,这是传奇的,因为它不能正常工作。如果标准委员会不能使这样的容器工作,那可能不是一个好主意。

答案 1 :(得分:1)

您可能希望了解std::vector<bool>特化迭代器的实现,因为它们解决了同样的问题。请注意,随着时间的推移,专业化已经不再主要因为它不符合容器要求(迭代器不提供对实际包含类型的引用,而是代理值),这也是你的问题实施

另一种可能的方法是使用常规容器,但使用存储类型接受实现与用户期望类型之间的分配/转换。如果您当前存储的类型无法实现,则可以为其编写包装器。

一个简化的包装器(你需要对它进行处理才能使它工作):

template <typename T, typename U>
class wrapper
{
public:
   typedef T store_type;
   typedef U value_type;
   wrapper() : stored() {}
   wrapper( value_type const & v ) 
      : stored( convert<store_type>(v) {}
   wrapper& operator=( value_type const & value ) { // or pass-by-value
      stored = convert<store_type>(value); // or however you can convert them
      return *this;
   }
   operator value_type() const { // I don't quite like this, if possible use explicit conversions
      return convert<value_type>(stored);
   }
private:
   store_type stored; // maybe storage is handled externally and this can be pointer/ref.
};
// For the simple test double<->int conversion static cast suffices
template <typename T, typename U>
T convert( U in ) {
   return static_cast<T>(in); 
}
int main() {
   std::vector< wrapper<double,int> > v;
   v.push_back( 10 );
   int x = v[0];
   v[0] = 5;

   std::vector< wrapper<int,double> > v2;
   v.push_back( 10.5 );
   double y = v2[0];
   v2[0] = 11.3;
}