囚人さんの
「partial class と code snippet で Mix-in 」
http://blogs.wankuma.com/shuujin/archive/2006/10/08/40927.aspx
にいんすぱいあされてC++でもやってみんぞ。
多重継承を使わずにclass Tを修飾することでMix-inするココロミ。
こいつのキモは:
template<typename T>
class Hoge : public T { ... };
よーするに Hoge<Base> は Base の派生クラスになっちまうてワザ。
んだから、Hoge<T> にメソッドを定義すると Hoge<Base> は
「Baseでできること+Hogeで追加したこと」ができちゃうわけだな。
こいつは.NETのgenericsにはマネができません。
template<typename T>
class Comparable : public T { // ココがキモ!
friend bool operator ==(const Comparable& lhs, const Comparable& rhs)
{ return lhs.CompareTo(rhs) == 0; }
friend bool operator !=(const Comparable& lhs, const Comparable& rhs)
{ return lhs.CompareTo(rhs) != 0; }
friend bool operator < (const Comparable& lhs, const Comparable& rhs)
{ return lhs.CompareTo(rhs) < 0; }
friend bool operator <=(const Comparable& lhs, const Comparable& rhs)
{ return lhs.CompareTo(rhs) <= 0; }
friend bool operator > (const Comparable& lhs, const Comparable& rhs)
{ return lhs.CompareTo(rhs) > 0; }
friend bool operator >=(const Comparable& lhs, const Comparable& rhs)
{ return lhs.CompareTo(rhs) > 0; }
};
/*
* おためし
*/
class Test {
private:
int value_;
public:
Test(int v=0) : value_(v) {}
int CompareTo(const Test& rhs) const
{ return value_ - rhs.value_; }
};
#include
int main() {
Comparable<Test> x, y;
std::cout << std::boolalpha;
std::cout << (x == y) << std::endl;
std::cout << (x != y) << std::endl;
std::cout << (x < y) << std::endl;
std::cout << (x <= y) << std::endl;
std::cout << (x > y) << std::endl;
std::cout << (x >= y) << std::endl;
}
どだ、おもしろかろ?