C++ Idioms 05

本文深入探讨了C++中的五种高级用法:ShrinkToFit、ThinTemplate、TypeSelection、VirtualConstructor和VirtualFriendFunction,提供了详细的用途说明及示例代码,帮助读者掌握更高效的编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 本文介绍了 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); // or
vecotr<int>(v.begin(), v.end()).swap(v); // or
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; // 即 long i
IF<true, int, long>::type j;  // 即 int 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;   // 若 N <= 256,则相当于 unsigned char size;
                             // 若 N > 256 && N <= 65536,则相当于 unsigned short size;
                             // 若 N > 65536,则相当于 unsigned int 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值