Просто чтобы повторить и расширить то, что упоминалось в предыдущих электронных письмах, позвольте мне сначала дать вам пример того, как реализовать признак Scala Ordered в C ++, а затем позвольте мне показать, как вы можете смешивать произвольное количество «черт» при создании экземпляра. время.
Давайте начнем с упорядоченной черты. Если вы знакомы с 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. Чего он не может сделать, так это стекового поведения.
НТН.