看板 C_and_CPP 關於我們 聯絡資訊
唔,還是講一下好了 ※ 引述《yoco315 (眠月)》之銘言: : 很簡單的繼承,Foo 繼承 Bar,沒有指明繼承的形式表示是 public 繼承。 ^^^^^^ 是 private 推文說了,建議修文 : ┌─────────────────────────── : │template < class T > : │class Foo : T : │{ : │ ... : │} ; : └─────────────────────────── : 看起來很玄,其實就是 Foo 繼承 T, : 不過這個 T 是個 template, 我會說 T 是個 class 而非 template, 就像上篇我在推文說的 理由出自 template template (or more template) parameter template < template <class> class T > class Foo; T 是什麼?不是 class, 是 template Foo<int> foo; // error, int is not template template <class T> class Bar; Foo<Bar> foo; // ok, Bar is template Bar<Bar> bar; // error, Bar is not class Bar< Bar<int> > // ok, Bar<int> is class 可以玩更複雜一點 template < template < template<class> class T > class U > class Test{}; template < template<class> class T > class Test2: private T<int>{}; // 寫 T 不行,因為不能繼承 template Test<Test2> test; // ok, Test2 is template template : Loki::Typelist 還有用到類似這樣的寫法 : ┌─────────────────────────── : │template < class T, class U > : │Foo : T < U > : │{ : │} : └─────────────────────────── 不對吧,Typelist 是這樣做的 template <class Head, class Tail> class Typelist{}; 然後是這樣串的 Typelist< int, Typelist<int, Typelist<int, Typelist<int, NullType> > > > 頭咬尾巴這樣 你說的東西後述 : 這可以用來實作 Typelist 技術。 ^^^^^^^^ 是 Tuple : ┌─────────────────────────── : │template < typenamep T > : │class Holder : │{ : │ private: T value_ ; : │ public: T & value() { return value_ ; } : │} ; : │ : │typedef TYPELIST_3 ( Array2D, Array2D, Array2D ) RGB_Typelist ; : │typedef TYPELIST_3 ( Array2D, Array2D, Array2D ) HSV_Typelist ; : │typedef TYPELIST_3 ( Array2D, Array2D, Array2D ) Lab_Typelist ; : │typedef TYPELIST_4 ( Array2D, Array2D, Array2D, Array2D ) YMCK_Typelist ; : │ : │typedef Loki::GenScatterHierarchy < RGB_Typelist , Holder > RGB_Image ; : │typedef Loki::GenScatterHierarchy < HSV_Typelist , Holder > HSV_Image ; : │typedef Loki::GenScatterHierarchy < Lab_Typelist , Holder > Lab_Image ; : │typedef Loki::GenScatterHierarchy < YMCK_Typelist, Holder > YMCK_Image ; : └─────────────────────────── 參考 Loki::Tuple, 你說的這個跟 Loki::Tuple 做法很接近(其實算一樣了) 而這裡的 Typelist 是用頭咬尾做的,GenScatterHierarchy 才是運用繼承技術 不過真正的實作法很複雜,這裡就不說明了…(其實是我還沒完全看懂 Orz) : RGB_Image img ; : Loki::Field<0>(img).value() = ... : Loki::Field<1>(img).value() = ... : Loki::Field<2>(img).value() = ... Loki 的 Tuple 的 holder 是這樣寫的 template <class T> struct TupleUnit { T value_; operator T&() { return value_; } operator const T&() const { return value_; } }; 所以用 Loki::Tuple 的話是這樣寫 RGB_Image img; Field<0>(img) = 255; Field<1>(img) = 255; Field<2>(img) = 255; Loki:: 可以省略,因為 Koenig Lookup... : 真是酷! : Loki::Typelist 會根據你給的 Typelist, : (就是一串型別,像是這樣 int, int, double, Foo, Bar ) : 使用遞迴繼承自己的方法, 這是 GenScatterHierarchy... GenScatterHierarchy 會依照 Typelist 裡面的型別依序繼承 Typelist 就只是型別串列而已 : 實作細節有興趣的話可以看 《Modern C++ Design》。 indeed... 不過看原始碼更快 http://sourceforge.net/projects/loki-lib 現在 0.14 了,裡面多一堆書上沒寫的東西 Sutter 的 Pimpl 也有(0.14 新增) ScopeGuard(0.13 新增) 還有一堆有興趣自己看吧… -- Nobody can take anything away from him. Nor can anyone give anything to him. What came from the sea, has returned to the sea. Chrono Cross -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.19.204 ※ 編輯: godfat 來自: 140.138.19.204 (04/18 14:32)