War es hilfreich?

Lösung

Nein, aber es kann in unterschiedlichem Maße mit Vorlagen gefälscht werden:

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>);
}

total ehrlich zu sein, habe ich nicht getestet, indem sie es kompilieren, aber Sie sollten die Idee.

Andere Tipps

Einige Aspekte der Scala Mixins können unter Verwendung von mehreren (virtuellen) Vererbung erfüllt werden. Leider führt dies oft mehr Probleme als sie löst. Sie können aber auch nicht Super on the fly mischen und a la :

val me = new Human with Coder with Musician

Wenn Sie wirklich, wirklich true Mixins wollen, müssen Sie fast mit so etwas wie die Vorlage Lösung gehen in der Antwort Vorschlag @ Logan Capaldo .

Just zu wiederholen und zu erweitern, was in früheren E-Mails erwähnt lassen Sie mich Ihnen zunächst ein Beispiel geben, wie die Scala bestellt Merkmal in C ++ implementieren und dann lassen Sie mich zeigen, wie Sie-Mix in bei der Instanziierung einer beliebigen Anzahl von „Traits“ Zeit.

Lassen Sie uns zuerst mit dem bestellten Zug starten. Wenn Sie mit dem Scala SDK vertraut sind, haben Sie bemerkt, dass es ein geordnetes Merkmal ist. Dies wird verwendet, durch totale Ordnung zu schaffen, ein einfaches „Vergleichen“ Verfahren. In C ++ können Sie das gleiche tun wie folgt:

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; }
};

Dann gibt auf eine C ++ Klasse Bestellung Eigenschaft Sie folgendes tun:

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

Natürlich können Sie so viele „Traits“ mix-in, wie Sie wollen, aber wenn Sie auf diese Weise tun können Sie nicht Züge bei der Instanziierung Zeit hinzufügen oder entfernen. Gibt es eine einfache Lösung für dieses? Art-of.

Haben über die C ++ 0x variadische Vorlagen gehört? Dies bietet eine Möglichkeit, Misch in so viele Züge wie Sie bei Vorlage Instanziierung Zeit möchten.

Der Trick ist einfach, erklären nur Ihre Host-Klasse wie folgt:

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

Was ist der Haken dabei? Nun, das Problem ist, dass es nicht möglich ist, so etwas zu tun:

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

, die in einigen Fällen praktisch gewesen wäre.

In jedem Fall hat C ++ einigen grundlegenden Mechanismus, mit denen Ihnen einige Aspekten des Scala Mix-In emulieren. Was es nicht kann, ist jedoch Stapelverhalten.

HTH.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top