3 回答
不,但它可以用模板在不同程度上伪造:
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>);
}
老实说,我还没有通过编译来测试它,但你应该明白了。
Scala mixin 的某些方面可以使用多重(虚拟)继承来满足。不幸的是,这通常会带来比它解决的问题更多的问题。此外,您不能即时混合和匹配超类:
val me = new Human with Coder with Musician
如果您真的非常想要真正的 mixins,您几乎必须使用类似@Logan Capaldo的答案中提出的模板解决方案。
只是为了重申和扩展之前电子邮件中提到的内容,让我首先给您一个示例,说明如何在 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。