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)。