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

المحلول

لا، ولكن يمكن أن تكون مزورة بدرجات متفاوتة مع قوالب:

template<typename AbsIterator> 
class RichIterator : public AbsIterator {
public:
   template<typename FuncType>
   void foreach(FuncType f) { while( hasNext() ) f( next() ); }
};

class StringIterator {
  std::string m_s;
  int i;
public:
  typedef char T;
  StringIterator() : m_s(), i(0) {} // Unfortunately need this, or 
                                    // else RichIterator
                                    // gets way more complicated
  StringIterator(const std::string &s) : m_s(s), i(0) {}
  void swap(StringIterator& other) {
     m_s.swap(other.m_s);
     std::swap(i, other.i);
  }
  void reset_str(const std::string& s) {
     StringIterator(s).swap(*this);
  }
  bool hasNext() { return i < m_s.length(); }
  char next() { return m_s[i++]; }
};

template<typename Outputable>
void println(const Outputable& o) {
   std::cout << o << std::endl;
}

int main(int argc, char **argv) {
  typedef RichIterator<StringIterator> Iter;
  Iter iter;
  iter.reset_str(argv[1]);
  iter.foreach(&println<Iter::T>);
}

لنكون صادقين تماما، لقد لم تختبر ذلك عن طريق تجميع ذلك، ولكن يجب عليك الحصول على هذه الفكرة.

نصائح أخرى

ويمكن أن يكون راضيا بعض جوانب mixins سكالا باستخدام متعددة (الظاهري) الميراث. للأسف، وهذا غالبا ما يدخل المزيد من المشاكل أكثر مما يحل. أيضا، لا يمكنك مزيج المباراة وsuperclasses على الطاير <م> على غرار :

val me = new Human with Coder with Musician

إذا كنت حقا، <م> حقا تريد mixins الحقيقية، لديك تقريبا للذهاب مع شيء من هذا القبيل الحل النموذج المقترح في الإجابة من طرف @ <لأ href = "https://stackoverflow.com/questions / 505686 / ل-هناك-سكالا مثل-mixins مقابل ج / 505757 # 505757 "> لوغان Capaldo .

وفقط أن أكرر وتوسيع ما ورد في رسائل البريد الإلكتروني السابقة اسمحوا لي أولا أن أقدم لكم مثالا لكيفية تنفيذ سكالا سمة أمرت في C ++ ثم اسمحوا لي أن تظهر كيف يمكنك خلط في عدد التعسفي من "الصفات" في مثيل الوقت.

لنبدأ أولا مع سمة أمر. إذا كنت معتادا على SDK سكالا عليك وقد لاحظت أن هناك سمة أمر. هذا وتستخدم لتقديم الطلب الكلي عن طريق تنفيذ بسيطة "مقارنة" الأسلوب. في C ++، هل يمكن أن تفعل الشيء نفسه على النحو التالي:

template <typename T>
class Ordered {
public:
    virtual int32_t compare(const T& that) = 0;
    bool operator >(const T& that) {return this->compare(that) == 1; }
    bool operator >=(const T& that) {return this->compare(that) >= 0; }

    bool operator ==(const T& that) { return this->compare(that) == 0; }

    bool operator <=(const T& that) {return this->compare(that) <= 0; }
    bool operator <(const T& that) {return this->compare(that) == -1; }
};

وبعد ذلك، لإعطاء الأمر الخاصية إلى C ++ درجة التي يمكن أن تفعل ما يلي:

class MyOrderedType : public Ordered<MyOrderedType> {
public:
  // Your ctor/dtors, methods
public:
  int compare(const MyOrderedType& that);
};

ومن الواضح أن يمكنك خلط في العديد من "الصفات" كما تريد ولكن إذا قمت بذلك بهذه الطريقة لا يمكنك إضافة أو إزالة الصفات في وقت مثيل. هل هناك حل بسيط لهذا؟ نوع من.

هل سمعت عن القوالب variadic C ++ 0X؟ وهذا يوفر وسيلة لخلط في العديد من الصفات التي تريدها في وقت قالب مثيل.

وهو خدعة بسيطة، فقط يعلن الطبقة المضيف الخاص بك كما يلي:

template <typename... MIXINS>
class Host : public MIXINS... {
 // Your implementation
};

ما هو الصيد هنا؟ حسنا، المسألة لأنه ليس من الممكن أن تفعل شيئا من هذا القبيل:

template <typename... MIXINS>
class Host : public MIXINS<HOST>... {
    // Your implementation
};

والتي في بعض الحالات يمكن أن يكون في متناول يدي.

في أي حال، C ++ لديه بعض الآلية الأساسية التي تسمح لك لمحاكاة بعض جوانب ميكس الإضافية سكالا. ما لا يمكن القيام به، ومع ذلك، يتم التراص السلوك.

وHTH.

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