陈硕的题和解决方法:
一道 C++ 思考题:std::string 的 operator << 和 operator >> 是如何声明的,如何避免与 iostream 的过度耦合?iostream 和 string 都可以单独 include 来使用,显然 iostream 头文件里不会定义 string 的 << 和 >> 操作。那么 string 头文件里会不会为了定义 << 和 >> 而 include iostream 呢?
C++ 对此有一个解决办法,写一个 non-member non-friend 且与 class 位于同一 namespace 的 templated operator <<,并且把操作转发给 class member function 'writeTo',后者可能本身是个 template,这样可以避免耦合到 iostream。
泛型编程原意是用通用的代码应用不同类型,这里是铁定只有一种类型的情况下用于解耦。<<算是应用于两个运算元的操作符,一个是string,一个iostream。你在使用string的时候不一定用到iostream,使用iostream的时候不一定用到string,又要求必须支持iostream对string的<<操作。这时候自然要解耦了,这里模板只是为了解耦,不是为了泛型算法,因为需要支持iostream而不是多种类型。
另外,c++中某个函数内通过一个接口,必须要接受实现这个接口的类作为参数;或者有些是访问变量,这个类必须声明了这个变量。
int a(const A* pa)
{
pa->b();
}
而动态语言,比如as、lua,不会做严格类型检查,不需要事先声明,只要运行时接收的object有这个属性就可以了。
c++中可以通过模板实现这种要求。