[英]A C++ iterator adapter which wraps and hides an inner iterator and converts the iterated type
[英]Custom iterator which converts values before saving it
典型的正向迭代器有望實現以下方法:
value_type& operator*();
value_type* operator->();
我正在為自定義容器編寫自定義迭代器,用戶希望該容器看到的value_type
與容器內部值的表示形式不同。 因此,當將value_type
值返回給用戶時,我將其從內部表示形式轉換為用戶期望的value_type
。 在提到的成員內部很容易實現。
您能否建議如何處理L值? 當用戶以*it = value_type(5)
類的語法向迭代器分配值時,在哪里可以處理value_type
到內部表示的轉換?
我曾想過要返回一個函子,但由於調用方的語法異常,我不喜歡這個想法。
如果要返回引用,則除非存儲轉換后的值,否則無法轉換和返回引用,這時我開始質疑內部表示的要點。 我不確定您想要的東西是否還可以。 一個例子就是vector<bool>
,這是傳說中的,因為它不能正常工作。 如果標准委員會不能使這種容器工作,那可能不是一個好主意。
您可能想看看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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.