C ++のためのScalaのようなミックスインはありますか?
-
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>);
}
完全に正直に言うと、私はそれをコンパイルして、これをテストしていませんしましたが、あなたのアイデアを得る必要があります。
他のヒント
Scalaのミックスインのいくつかの態様は、複数の(仮想)継承を使用して満たすことができます。残念ながら、これは多くの場合、それは解決よりも多くの問題を紹介します。また、あなたが混在し、フライのラの上のスーパークラスと一致しないことができます:
val me = new Human with Coder with Musician
あなたは本当に、の本当にのが真のミックスインをしたい場合は、、あなたはほとんど@ <のhref = "https://stackoverflow.com/questionsでの回答で提案されているテンプレート溶液のようなもので行かなければなりません/ 505686 /ある - そこに - Scalaの様ミックスイン-用-C / 505757#505757" >ローガンCapaldo のます。
ちょうど私が最初にあなたにスカラを実装する方法の例を挙げてみましょう繰り返すと、前のメールに記載されたものを拡張するために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の可変引数テンプレートについて聞いたことがありますか?これは、混合-のように多くの特徴を使用すると、テンプレートのインスタンス化時に好きな方法を提供します。
トリックは単純で、次のようにちょうどあなたのホストクラスを宣言します:
template <typename... MIXINS>
class Host : public MIXINS... {
// Your implementation
};
ここでは、キャッチは何ですか?さて、問題は、このような何かをすることはできないということです。
template <typename... MIXINS>
class Host : public MIXINS<HOST>... {
// Your implementation
};
どのいくつかのケースでは便利されていると思います。
どのような場合には、C ++を使用すると、Scalaのミックスインのいくつかの側面をエミュレートできるようにするいくつかの基本的な機構を有しています。それができないことは何、しかし、行動を積み重ねています。
HTHます。