هل هناك طريقة للوصول إلى الأجزاء الخاصة من مثيل مختلف لنفس قالب الفئة؟

StackOverflow https://stackoverflow.com/questions/1191944

  •  19-09-2019
  •  | 
  •  

سؤال

في مغامرتي المستمرة مع القوالب، قمت بتضمين فئة الحاويات الخاصة بي ليس فقط على ItemType، ولكن أيضا على حجة Functor تحدد كيفية طلب العناصر. حتى الان جيدة جدا.

تحدث مشكلة صغيرة في حدوثها عندما أرغب في نسخ محتويات حاوية واحدة إلى أخرى: إذا كان لدى الحاويات نوعين أنواعا مختلفة من Functor، فهي فئات غير ذات صلة بشكل تقني. لذلك، لا يسمح للحاوية A بالوصول إلى المحتويات غير العامة للحاوية B. هل هناك أي طريقة جيدة للتعامل مع هذه المشكلة، بخلاف جعل كل ما أحتاج إليه للوصول إلى الجمهور؟ بطريقة ما لتقليل إعلان "صديق"، ربما؟

المثال المثال لإظهار المشكلة يتبع:

#include <stdio.h>

class FunctorA {};
class FunctorB {};

template <class ItemType, class Functor> class MyContainer
{
public:
   MyContainer() : _metaData(0) {/* empty */}

   template<class RHSFunctor> void CopyFrom(const MyContainer<ItemType, RHSFunctor> & copyFrom)
   {
      _metaData = copyFrom._metaData;
      _item     = copyFrom._item;
   }

private:
  int _metaData;
  ItemType _item;
};

int main(int argc, char ** argv)
{
   MyContainer<void *, FunctorA> containerA;
   MyContainer<void *, FunctorB> containerB;

   containerA.CopyFrom(containerB);  // error, containerA::CopyFrom() can't access containerB's private data!
   return 0;
}
هل كانت مفيدة؟

المحلول

يمكنك إجراء فئة قالب قاعدة قالب فقط على ItemType، والحفاظ على البيانات هناك، ولديها فرعية فرعية فرعية كاملة من 2-Args هذه القاعدة، ووضع النسخ من الفئة الأساسية لأنها لا تعتمد على Functor على أي حال وبعد بمعنى آخر:

template <class ItemType> class MyContainerBase
{
public:
   MyContainerBase() : _metaData(0) {/* empty */}

   void CopyFrom(const MyContainerBase<ItemType> & copyFrom)
   {
      _metaData = copyFrom._metaData;
      _item     = copyFrom._item;
   }

protected:
  int _metaData;
  ItemType _item;
};

template <class ItemType, class Functor> class MyContainer:
    public MyContainerBase<ItemType>
{
  // whatever you need here -- I made the data above protected
  // just on the assumption you may need to access it here;-)
};

نصائح أخرى

كما تشير، يمكنك أيضا استخدام وظيفة صديق:

class FunctorA {};
class FunctorB {};

template <class ItemType, class Functor> class MyContainer
{
public:
  MyContainer() : _metaData(0) {/* empty */}

  template<class CmnItemType, class LHSFunctor, class RHSFunctor>
  friend void Copy(const MyContainer<CmnItemType, LHSFunctor> & copyFrom
    , MyContainer<CmnItemType, RHSFunctor> & copyTo);

private:
  int _metaData;
  ItemType _item;
};

template<class CmnItemType, class LHSFunctor, class RHSFunctor>
void Copy(const MyContainer<CmnItemType, LHSFunctor> & copyFrom
  , MyContainer<CmnItemType, RHSFunctor> & copyTo)
{
  copyTo._metaData = copyFrom._metaData;
  copyTo._item     = copyFrom._item;
}


int main(int argc, char ** argv)
{
  MyContainer<void *, FunctorA> containerA;
  MyContainer<void *, FunctorB> containerB;

  Copy(containerB, containerA);
  return 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top