21

Scala Mixins

4

3 に答える 3

14

いいえ。ただし、テンプレートを使用すると、さまざまな程度で偽造できます。

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

正直なところ、私はこれをコンパイルしてテストしていませんが、あなたはその考えを理解する必要があります。

于 2009-02-03T01:43:04.380 に答える
3

以前のメールで述べたことを繰り返し、拡張するために、最初に C++ で Scala Ordered トレイトを実装する方法の例を示し、次に、インスタンス化時に任意の数の「トレイト」を混在させる方法を示します。

まず Ordered トレイトから始めましょう。Scala SDK に精通している場合は、Ordered トレイトがあることに気付くでしょう。これは、単純な「比較」メソッドを実装することにより、完全な順序付けを提供するために使用されます。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);
};

明らかに、必要な数の「特性」を混在させることができますが、このようにすると、インスタンス化時に特性を追加または削除できなくなります。これに対する簡単な解決策はありますか?すこし。

C++0x 可変個引数テンプレートについて聞いたことがありますか? これにより、テンプレートのインスタンス化時に必要なだけ多くの特性を混合する方法が提供されます。

トリックは簡単です。ホスト クラスを次のように宣言するだけです。

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

ここでのキャッチは何ですか?さて、問題は、次のようなことはできないということです:

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

場合によっては便利だったでしょう。

いずれにせよ、C++ には、Scala の Mix-in のいくつかの側面をエミュレートできるいくつかの基本的なメカニズムがあります。ただし、スタッキング動作は実行できません。

HTH。

于 2010-08-20T23:19:48.290 に答える