21

Scala 混合

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

Scala mixin 的某些方面可以使用多重(虚拟)继承来满足。不幸的是,这通常会带来比它解决的问题更多的问题。此外,您不能即时混合和匹配超

val me = new Human with Coder with Musician

如果您真的非常想要真正的 mixins,您几乎必须使用类似@Logan Capaldo的答案中提出的模板解决方案。

于 2009-02-03T05:06:03.723 回答
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-ins 的某些方面。然而,它不能做的是堆叠行为。

HTH。

于 2010-08-20T23:19:48.290 回答