一个典型的前向迭代器应该实现以下方法:
value_type& operator*();
value_type* operator->();
我正在为自定义容器编写自定义迭代器,用户希望看到value_type
与容器内值的表示不同。因此,当向用户返回value_type
值时,我将其从内部表示转换为用户期望的value_type
。内部成员很容易实现。
你能建议如何处理l值吗?当用户使用value_type
等语法为迭代器赋值时,我在哪里可以处理*it = value_type(5)
到内部表示的转换?
我想回到一个仿函数但我不喜欢这个想法,因为呼叫者的语法不常见。
答案 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;
}