c++ template

template应该说既熟悉又陌生,目前的理解看来是更高一级的抽象。在做系统级的组件时候还是很有威力的。

 

 


 

template理解关键点在于template的instanciate的模式。

 

  • 最懒原则:在instanciate的时候,遵循最小原则或者最懒原则,能不instanciate则不instanciate。像有一些函数的实现没有被用到,则不会生成,这是一个基本原则,在我们需要判断的时候可以基于这个来。
  • 可以在link time instanciate,compile time instantication没问题,还有link time instanciation。

这里有一个例子就是virtual function,template里面也有virtual function,这种情况的处理是需要link time的处理来解决,书中给出一个解决方案是在第一个instanciation的文件中去生成virtual table,然后只生成这一个。可见linking势不可避免了。

 

使用export关键字可以做非include式的instanciate,这种情况下因为实现不可见,instanciate只是做了一个declaration,然后在通过linker去link到相应的实现,具体的实现应该是compile结束后compiler给linker提出具体的需求,然后进行definition的生成。

 


 

其他一些不太熟悉的topic:

 

显示声明实例话template可以有效控制compile time。

 

explicit specialization definition很方便很有用。

 

partial specialization

 

 

 

C++ templates are a powerful feature of the C++ programming language that allow generic programming. Templates enable the creation of functions and classes that can work with different data types without the need for separate implementations for each data type. Templates are defined using the keyword "template" followed by a list of template parameters enclosed in angle brackets "< >". The template parameters can be either type parameters or non-type parameters, depending on whether they represent a data type or a value. For example, a type parameter might be used to specify the data type of a container class, while a non-type parameter might be used to specify the size of an array. Here is an example of a simple function template that returns the maximum of two values: ```c++ template<typename T> T max(T a, T b) { return a > b ? a : b; } ``` In this example, the "typename" keyword is used to indicate that T is a type parameter. The function can be used with any data type for which the ">" operator is defined. Templates can also be used to define class templates, which are similar to regular classes but can work with different data types. Here is an example of a simple class template for a stack: ```c++ template<typename T> class Stack { public: void push(T value); T pop(); private: std::vector<T> data_; }; template<typename T> void Stack<T>::push(T value) { data_.push_back(value); } template<typename T> T Stack<T>::pop() { T value = data_.back(); data_.pop_back(); return value; } ``` In this example, the class template is defined with a single type parameter T. The member functions push and pop are defined outside the class definition using the scope resolution operator "::". Templates are a powerful tool that can greatly simplify code and make it more reusable. However, they can also be complex and difficult to debug. It is important to use templates judiciously and to thoroughly test them with a variety of data types.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值