Search code examples
c++scalatraitsmixinstemplate-mixins

Are there scala-like mixins for C++?


Scala Mixins


Solution

  • No, but it can be faked to varying degrees with templates:

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

    To be totally honest, I've haven't tested this by compiling it, but you should get the idea.