实现一个“大小写不敏感”的string类:
程序:
编译时会出现4个C4996警告,都是对VC的STL内部实现的说明。不明白,暂时无视之。
1> 大小写敏感是非常重要的属性
2> ci_char_traits是从char_traits公有派生,此处并不是常见的IS-A关系,所以不符合LSP原则(Liskov Substitution Principle)。
C++标准库中的traits并不是为派生而创造的,所以违反了LSP原则也没关系。因为ci_char_traits是当作模板参数的,符合模板参数的要求就可以了。
3> 虽然ci_char_traits是char_traits的子类,但是下面的代码无法编译:
ci_string s = "abc";
cout << s << endl;
要找原因,看operator<<和cout的定义:
看的出来,cout只能使用char_traits,而不认ci_char_traits。从侧面说明了模板库里的公有派生,并不是IS-A的关系。