new需要无限循环地获取资源,如果没能获取则调用"new handler",不存在"new handler"时应该抛出异常; new应该处理size为零的情况; delete应该兼容空指针; new/delete作为成员函数应该处理size > sizeof(Base)的情况(因为继承的存在)。
Effective C++ 50:为什么需要自定义 new 和 delete?
实现一个operator new很容易,但实现一个好的operator new却很难。
如何检查 JavaScript 变量类型?
JavaScript 基本数据类型有 6 种:字符串、数字、布尔、null、undefined、Symbol。 用户定义的类型(object)并没有类的声明,因此继承关系只能通过构造函数和原型链来检查。 本文要解决的问题,如何检查一个变量的类型?先给结论:
如果你要判断的是基本数据类型或JavaScript内置对象,使用toString
;
如果要判断的时自定义类型,请使用instanceof
。
不同的编程语言都有自己的方式来提供类型信息,例如 C# 的反射、C++的Traits, JavaScript 提供类型信息的方式更加灵活(杂),因而也容易误用。 下面来分析常见类型检查手段的区别:typeof, instanceof, constructor, toString。
如果你在寻找类型转换的解决方案,而非类型检查,请移步JavaScript类型转换。
Effective C++ 49:new handler 的行为
new申请内存失败时会抛出"bad alloc"异常,此前会调用一个由set_new_handler()指定的错误处理函数("new-handler")。
Effective C++ 48:了解模板元编程
模板元编程(Template Metaprogramming,TMP)就是利用模板来编写那些在编译时运行的C++程序。模板元程序(Template Metaprogram)是由C++写成的,运行在编译器中的程序。当程序运行结束后,它的输出仍然会正常地编译。
Effective C++ 47:使用 Traits 类提供类型信息
C++中的 Traits 类可以在编译期提供类型信息,它是用Traits模板及其特化来实现的。通过方法的重载,可以在编译期对类型进行"if...else"判断。我们通过STL中的一个例子来介绍Traits的实现和使用。
Effective C++ 46:需要类型转换时,应当在类模板中定义非成员函数
如果所有参数都需要隐式类型转换,该函数应当声明为非成员函数。本文把这个观点推广到类模板和函数模板。但是在类模板中,需要所有参数隐式转换的函数应当声明为友元并定义在类模板中。