C ++ 용 스칼라와 같은 믹스 인이 있습니까?
-
21-08-2019 - |
문제
해결책
아니요, 그러나 템플릿으로 다양한 정도로 위조 될 수 있습니다.
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.