Re: [語法] Template與Inheritance結合??
唔,還是講一下好了
※ 引述《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)
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章