本文介绍了 C++ 的 5 个特别用法(Idioms),分别是
Shrink to Fit; Thin Template; Type Selection; Virtual Constructor; Virtual Friend Function;
21. Shrink to Fit
用途
示例代码
vector< int > v;
vector< int > ( v) . swap ( v) ;
vecotr< int > ( v. begin ( ) , v. end ( ) ) . swap ( v) ;
v. shrink_to_fit ( ) ;
22. Thin Template
用途
降低目标代码(而不是源码)的重复程度,实现目标代码级别的复用
示例代码
class VectorBase {
void insert ( void * ) ;
void * at ( int index) ;
} ;
template < typename T>
class Vector < T* > : public VectorBase
{
inline void insert ( T* pt) {
VectorBase:: insert ( pt) ;
}
inline T* at ( int index) {
return VectorBase:: at ( index) ;
}
} ;
23. Type Selection
用途
示例代码
template < bool , class L , class R >
struct IF
{
using type = R;
} ;
template < class L , class R >
struct IF< true , L, R>
{
using type = L;
} ;
IF< false , int , long > :: type i;
IF< true , int , long > :: type j;
template < typename T, size_t N>
class Queue
{
private :
T arr[ N] ;
typename IF< ( N <= 256 ) ,
unsigned char ,
typename IF< ( N <= 65536 ) , unsigned short , unsigned int > :: type
> :: type size;
} ;
24. Virtual Constructor
用途
示例代码
使用普通指针
class Employee
{
public :
virtual Employee* create ( ) const = 0 ;
virtual Employee* clone ( ) const = 0 ;
virtual ~ Employee ( ) { }
} ;
class Manager : public Employee
{
public :
Manager ( ) ;
Manager ( const Manager& ) ;
virtual ~ Manager ( ) { }
Manager* create ( ) const { return new Manager ( ) ; }
Manager* clone ( ) const { return new Manager ( * this ) ; }
} ;
class Programmer : public Employee
{
public :
Programmer ( ) ;
Programmer ( const Programmer& ) ;
virtual ~ Programmer ( ) { }
Programmer* create ( ) const { return new Programmer ( ) ; }
Programmer* clone ( ) const { return new Programmer ( * this ) ; }
} ;
Employee* duplicate ( const Employee& ee) {
return ee. clone ( ) ;
}
使用 shared_ptr()
class Employee
{
public :
using PEmployee = std:: shared_ptr< Employee> ;
virtual ~ Employee ( ) { }
virtual PEmployee create ( ) const = 0 ;
virtual PEmployee clone ( ) const = 0 ;
} ;
class Manager : public Employee
{
public :
Manager ( ) ;
Manager ( const Manager& ) ;
virtual ~ Manager ( ) { }
PEmployee create ( ) const { return PEmployee ( new Manager ( ) ) ; }
PEmployee clone ( ) const { return PEmployee ( new Manager ( * this ) ) ; }
} ;
class Programmer : public Employee
{
public :
Programmer ( ) ;
Programmer ( const Programmer& ) ;
virtual ~ Programmer ( ) { }
PEmployee create ( ) const { return PEmployee ( new Programmer ( ) ) ; }
PEmployee clone ( ) const { return PEmployee ( new Programmer ( * this ) ) ; }
} ;
Employee:: PEmployee duplicate ( const Employee& ee) {
return ee. clone ( ) ;
}
25. Virtual Friend Function
用途
示例代码
class Base
{
friend ostream& operator << ( ostream& os, const Base& b) ;
public :
protected :
virtual void print ( ostream& os) const {
cout << "Base::print()" << endl;
}
} ;
inline ostream& operator << ( ostream& os, const Base& b) {
b. print ( os) ;
return os;
}
class Derived : public Base
{
public :
protected :
virtual void print ( ostream& os) const {
cout << "Derived::print()" << endl;
}
} ;
int main ( ) {
Base* pb = new Base;
Base* pd = new Derived;
cout << * pb << endl;
cout << * pd << endl;
return 0 ;
}