سؤال

أحتاج إلى مساعدة في فهم بعض عبارات التحميل الزائد لمشغل C++.يتم الإعلان عن الفصل مثل هذا:

template <class key_t, class ipdc_t>
class ipdc_map_template_t : public ipdc_lockable_t
{
    ...
    typedef map<key_t,
            ipdc_t*,
            less<key_t>> map_t;
    ...

قام منشئ الفصل بإنشاء مكرر لبنية الخريطة الداخلية:

struct iterator : public map_t::iterator
{
    iterator() {}
    iterator(const map_t::iterator & it)
        : map_t::iterator(it) {}
    iterator(const iterator & it)
        : map_t::iterator(
            *static_cast<const map_t::iterator *>(&it)) {}
    operator key_t() {return ((this->operator*()).first);}           // I don't understand this.
    operator ipdc_t*() const {return ((this->operator*()).second);}  // or this.

};

و begin() و end() يعيدان begin() و end() للخريطة:

iterator begin() {IT_ASSERT(is_owner()); return map.begin();}
iterator end() {return map.end();}

سؤالي هو، إذا كان لدي مكرر، كيف يمكنني استخدام تلك الأحمال الزائدة للحصول على المفتاح والقيمة؟

ipdc_map_template_t::iterator iter;
    for( iter = my_instance.begin();
             iter != my_instance.end();
         ++iter )
    {
        key_t my_key = ??????;
        ipdc_t *my_value = ??????;

    }
هل كانت مفيدة؟

المحلول

هذه هي عوامل تشغيل الطباعة، لذا يمكنك القيام بذلك:

{
    key_t   key = iter;
    ipdc_t *val = iter;
}

أو منذ ذلك الحين ipdc_map_template::iterator هي فئة فرعية من std::map::iterator, ، لا يزال بإمكانك استخدام الملحقات الأصلية (التي أجدها أكثر قابلية للقراءة):

{
    key_t   key = (*iter).first;
    ipdc_t *val = (*iter).second;

    // or, equivalently
    key_t   key = iter->first;
    ipdc_t *val = iter->second;

}

نصائح أخرى

عامل التشغيل key_t() وعامل التشغيل ipdc_t*() كلاهما تعريفات مصبوبة.لذلك، بالنظر إلى المكرر كما هو محدد في الفصل، يجب أن تكون قادرًا على تعيين المتغيرات الخاصة بك ببساطة:

ipdc_map_template_t::iterator iter;
    for( iter = my_instance.begin();
         iter != my_instance.end();
         ++iter )
    {
            key_t my_key = iter;
            ipdc_t my_value = iter;
    }

لقد تجاوز منشئ الفصل مشغلي الإرسال.لذلك بمجرد تعيين المكرر لكائن من النوع الصحيح، يجب أن يقوم تلقائيًا بإلقاء نفسه عبر الطرق في القيم الصحيحة.

ملحوظة::يتم تخزين نوع القيمة كمؤشر.لذا، عندما تقوم باستخراج القيمة، فإنك تحتاج إلى تحديد المؤشر لنوع القيمة الذي حددته في واجهة الخريطة.

 typedef ipdc_map_template_t<int,std::string>   MyMap;
 MyMap    mymap;

 for(MyMap::iterator iter = mymap.begin();
                     iter != mymap.end();
                     ++iter )
    {
            int          my_key   = iter;
            std::string* my_value = iter;

    }

لست متأكدًا من أنني أتفق مع الاتجاه المتخذ هنا.هل هذا يجعل الكود أكثر قابلية للقراءة؟سألتزم بمكرر الخريطة القديم الذي يبدو أكثر قابلية للاستخدام.هل يتم تعريف هذه الحاوية في بعض المكتبات المتخصصة التي تحتاجها، أم أنه من المفيد إلقاء نظرة على حاويات مؤشر التعزيز؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top