Effective C++ Chapter7-模版与泛型编程Template and Generic Programming

41、了解隐式接口与编译期多态
42、了解typename的双重意义
43、学习处理模版化基类内的名称
  • 概念:模版全特化(total template specialization)P239
  • 命令C++“不进入template base classes 观察”的行为失效。的三个办法:
    1 、在base class 函数调用之前加上"this ->"
    2、使用using声明式。
    3、明白指出被调用的函数位于base classes内部。(但是若被调用的函数是virtual函数,上述明确资格修饰(explicit qualification)会关闭"virtual绑定行为")
44、将参数无关的代码抽离templates

请记住:
1、Templates生成多个classes和多个函数,所以任何templates代码都不应该与某个造成膨胀的template参数产生依存关系。
2、非类型模版参数(non-type template parameters)造成的代码膨胀,往往可以消除,做法是以函数参数或classes成员变量替换template参数。
3、类型参数(type paramters)造成的函数代码膨胀,往往可以降低,做法是让带有完全相同的二进制表述(binary representations)的具现类型(instantiation types)共享实现码。

45、运用成员函数模版接受所有兼容类型
  • 所谓智能指针(Smart pointers)是行为像指针的对象,并提供指针没有的机能。STL容器的迭代器几乎和从时智能指针。
  • 真实指针可以:支持隐式转换。派生类指针可以隐式转换为基类指针,“指向non-const对象”的指针可以转换为“指向const对象”。
  • 请记住:
    1、请使用member function templates(成员函数模版)
    生成“可接受所有兼容类型”的函数。
    2、如果你声明member templates用于“泛化copy构造”或“泛化assignment操作”,你还是需要声明正常的copy构造函数和copy assognment操作符。
46、需要类型转换时,请为模版定义非成员函数(Define non-member functions inside templates when type conversions are desired)
  • 当我们编写一个class template,而它所提供之“与此tamplate相关的”函数支持“所有参数之隐式转换时”,请将那写函数定义为“class template 内部的friend函数”。
47、 请使用traits classes 表现类型信息
  • STL迭代器分五类。
  • Traits classes 是的“类型相关信息”在编译期间可用。他们以templates和templates 特列化实现。
  • 整合重载技术(overloading)后,traits classes有可能在编译期对类i小那个执行if..else测试。
48、认识template元编
#include 
using namespace std;

template
struct Factorial{
  enum {value = n *Factorial::value};  
};

template<>
struct Factorial<0>{
    enum {value = 1};
};

int main()
{
   cout << "Hello World" << endl; 
   cout << Factorial<5>::value ;
   
   return 0;
}

你可能感兴趣的:(Effective C++ Chapter7-模版与泛型编程Template and Generic Programming)