2010-05-19 87 views
0

一个典型的前向迭代有望实现以下方法之前转换值:自定义迭代器,其在保存

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

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

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

我想过要返回一个函数,但是我不喜欢这个想法,因为在调用者方面非常用的语法。

回答

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; 
} 
+0

能否请您提供使用这种包装的样本?方法将如何? – flashnik 2010-05-19 09:23:56

+0

您是否有关于界面类型和商店类型的其他信息? – 2010-05-19 09:26:55

+0

只是'value_type'和'stored_type'。它是一个模板参数。通常'stored_type'是'int *'。另外还有一个'Wrapper',其成员为'value_type operator()(strored_type s)'和'stored_type operator()(value_type v)',但是可以添加任何其他类型。 – flashnik 2010-05-19 09:32:46

3

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