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 會被實例化為Foo,而在Blah::Func 中的:

1
C<T>().template Func<T>()

就是去呼叫(call) Foo<int>::Func<int>,但為什麼要加上template 呢??2,因為在編譯器角度,Func可以是類型(Type),可以是變數(Variable),也可以是其他東西,它需要知道它是什麼才可以正確編譯3。所以就有了keyword template 的這種用法了4

有時我覺得,C++真的很博大精深,經常會想到一句名句:「知道得越多,就會知道得越少!」

  1. 我本人不太喜歡模板化這個字,所以不用了
  2. 事實上,若你不加上template這個keyword,在Visual Studio中是可以的,但這是VS不跟C++ Standard的例子之一:)
  3. typename 的使用相同
  4. 我也是最近才知道得比較清楚
  1. 2 Responses to “Keyword Template [C++ 求生筆記]”

  2. 真係聞所未聞~ Good post!

    By Milo on Apr 7, 2008

  3. 第三個用法,我也是最近才porting Amop時,才知道的!!

    By rdescartes on Apr 7, 2008

Post a Comment