Keyword Template [C++ 求生筆記]
April 4, 2008 – 10:42 am作為一個C++程序員,C++ 這語言本身的認識,是很重要的。有時,有一些語法和守則,因為太少接觸和應用,所以會完全忽略了。希望這個C++ 求生筆記系列,可以給大家參考和交流一下。
今天先說一下這個keyword:template,一個簡單的使用如下:
1 2 3 4 5 6 7 8 9 10 11 12 | template < typename T > class Foo { public: template <typename R> R Func() { return R(); } }; |
這一段程序定義了一個Template1 Class和一個Template Function,以下是使用它時的代碼:
1 2 | Foo<int> foo; foo.Func<float>(); |
實例化(instantiate)了Foo,再實例化了Func,很簡單,對吧。
另一個使用template的時候,是比較少用到的 template template parameter:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | template < typename T , template <class S> class C > class Bar { public: C<T> Func() { return C<T>(); } }; Bar<int, Foo> bar; bar.Func(); // Should return a Foo<int> Object |
Bar 以一個typename 和一個 template Class 作為它的template 參數,在此例子中就是int和我們之前定義的Foo。所以,Bar::Func的返回值,就是Foo<int>。這個應用其實不難看到的,在一些講解C++ Template 的書中也有提及。
最後我想講的是這個:
1 2 3 4 5 6 7 8 9 10 11 12 13 | template <class T, template <class S> class C > class Blah { public: T Func() { // Calling Foo<int>::Func<int> return C<T>().template Func<T>(); } }; Blah<int, Foo> blah; blah.Func(); |
和Bar 一樣,C
1 | C<T>().template Func<T>() |
就是去呼叫(call) Foo<int>::Func<int>,但為什麼要加上template 呢??2,因為在編譯器角度,Func可以是類型(Type),可以是變數(Variable),也可以是其他東西,它需要知道它是什麼才可以正確編譯3。所以就有了keyword template 的這種用法了4。
有時我覺得,C++真的很博大精深,經常會想到一句名句:「知道得越多,就會知道得越少!」
2 Responses to “Keyword Template [C++ 求生筆記]”
真係聞所未聞~ Good post!
By Milo on Apr 7, 2008
第三個用法,我也是最近才porting Amop時,才知道的!!
By rdescartes on Apr 7, 2008