도움이 되었습니까?

해결책

아니요, 그러나 템플릿으로 다양한 정도로 위조 될 수 있습니다.

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

솔직히 말해서, 나는 그것을 컴파일하여 이것을 테스트하지 않았지만, 당신은 아이디어를 얻어야합니다.

다른 팁

스칼라 믹스 인의 일부 측면은 다중 (가상) 상속을 사용하여 만족할 수 있습니다. 불행히도, 이것은 종종 해결하는 것보다 더 많은 문제를 소개합니다. 또한, 당신은 슈퍼 클래스를 즉시 혼합하고 일치시킬 수 없습니다. 류 풍의:

val me = new Human with Coder with Musician

당신이 정말로 진짜 True Mixins를 원합니다. @의 답변에서 제안한 템플릿 솔루션과 같은 것을 거의 사용해야합니다.로건 카팔도.

이전 이메일에서 언급 한 내용을 반복하고 확장하려면 먼저 C ++에서 Scala 주문 특성을 구현하는 방법에 대한 예를 제공 한 다음 인스턴스화 시간에 임의의 "특성"을 혼합 할 수있는 방법을 보여 드리겠습니다.

순서대로 먼저 시작하겠습니다. Scala 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);
};

분명히 당신은 원하는만큼 많은 "특성"을 혼합 할 수 있지만 이런 식으로하면 인스턴스화 시간에 특성을 추가하거나 제거 할 수 없습니다. 이것에 대한 간단한 솔루션이 있습니까? 종류.

C ++ 0X Variadic 템플릿에 대해 들어 보셨습니까? 이것은 템플릿 인스턴스화 시간에 원하는만큼 많은 특성을 혼합하는 방법을 제공합니다.

트릭은 간단합니다. 호스트 클래스를 다음과 같이 선언합니다.

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

여기에 캐치는 무엇입니까? 글쎄, 문제는 다음과 같은 일을 할 수 없다는 것입니다.

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

어떤 경우에는 편리했을 것입니다.

어쨌든 C ++에는 Scala의 믹스 인의 일부 측면을 모방 할 수있는 몇 가지 기본 메커니즘이 있습니다. 그러나 할 수없는 것은 행동을 쌓는 것입니다.

HTH.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top