簡體   English   中英

自定義迭代器,可在保存之前轉換值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM