2.3 局部類
你可以在函數中定義class:
1 void Fun(){
2 class Local{};
3 }
不過有些限制,local class不能定義靜態成員變量,也不能訪問非靜態局部變量。但它可以用于模板函數:
1 class Interface{
2 public:
3 virtual void Fun()=0;
4 };
5
6 template <class T, class P>
7 Interface* MakeAdapter(const T& obj, const P& arg)
8 {
9 class Local : public Interface{
10 public:
11 Local(const T& obj, const P& arg)
12 : obj_(obj), arg_(arg){};
13 virtual void Fun(){
14 obj_.Call(arg_);
15 }
16 private:
17 T obj_;
18 P arg_;
19 };
20 return new Local(obj, arg);
21 };
事實證明,任何local classes的方法都可以用“函數外的模板類”來完成,也就是說,并非得局部類不可。不過,局部類可以提高符號的地域性,如上例,Local不能在函數外被繼承,類似Java的final。
11章將應用產生所謂“彈簧墊”函數(trampoline functions)。